Shell
如何將 find 命令中的文件分組為一行,其中每個文件都在雙引號內?
這是我在處理使用 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。
總結一下,您可以使用以下
-exec
方法:find . -name "*ES 03-11*" -exec cat {} +
或一種
xargs
方法:find . -name "*ES 03-11*" | xargs -I xx cat xx
這正是 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