这是我在处理使用 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