![如何将 find 命令中的文件分组到一行中,其中每个文件都在双引号内?](https://linux22.com/image/185235/%E5%A6%82%E4%BD%95%E5%B0%86%20find%20%E5%91%BD%E4%BB%A4%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6%E5%88%86%E7%BB%84%E5%88%B0%E4%B8%80%E8%A1%8C%E4%B8%AD%EF%BC%8C%E5%85%B6%E4%B8%AD%E6%AF%8F%E4%B8%AA%E6%96%87%E4%BB%B6%E9%83%BD%E5%9C%A8%E5%8F%8C%E5%BC%95%E5%8F%B7%E5%86%85%EF%BC%9F%20.png)
这是我在处理使用 find 找到的文件的迭代或操作时经常遇到的问题。
我有以下文件:
$ find . -name "*ES 03-11*"
./01jan/ES 03-11.txt
./02feb/ES 03-11.txt
./03mar/ES 03-11.txt
./04apr/ES 03-11.txt
./05may/ES 03-11.txt
我想启动以下命令:
$ cat "./01jan/ES 03-11.txt" "./02feb/ES 03-11.txt" "./03mar/ES 03-11.txt" "./04apr/ES 03-11.txt" "./05may/ES 03-11.txt" | process
这意味着连接 find 提供的每一行,但我猜用双引号或简单引号括起来。
我已经尝试过这个:
find . -name "*ES 03-11*" | awk '{printf "\"%s\" ", $0}' | xargs cat | process
这似乎可行,但我想知道是否有其他方法可以在不使用 awk 或做一些容易记住或键入的事情的情况下做到这一点。
我正在使用 FreeBSD 和 Bourne Shell。
答案1
总结一下,您可以使用以下-exec
方法:
find . -name "*ES 03-11*" -exec cat {} +
或一种xargs
方法:
find . -name "*ES 03-11*" | xargs -I xx cat xx
答案2
这正是 NULL 终止功能的用途。不幸的是,虽然find -print0
存在,xargs
但 FreeBSD 上的命令似乎没有匹配的-0
.这排除了xargs
作为任何解决方案的一部分。
另一个解决方案是迭代您的模式
for file in */*'ES 03-11'*; do cat "$file"; done | process
或者,对于许多文件,
for dir in *
do
[ -d "$dir" ] || continue
for file in "$dir"/*'ES 03-11'*
do
[ -f "$file" ] && cat "$file"
done
done | process
或者甚至直接
cat */*'ES 03-11'* | process