如何将 find 命令中的文件分组到一行中,其中每个文件都在双引号内?

如何将 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。

答案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

相关内容