findコマンドのファイルを各ファイルが二重引用符内にある1行にグループ化する方法は? [コピー]

findコマンドのファイルを各ファイルが二重引用符内にある1行にグループ化する方法は? [コピー]

これは、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残念ながら、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

関連情報