これは、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