Shell

如何將 find 命令中的文件分組為一行,其中每個文件都在雙引號內?

  • December 19, 2020

這是我在處理使用 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存在,但xargsFreeBSD 上的命令似乎沒有匹配的-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

引用自:https://unix.stackexchange.com/questions/625323