多くの場合find
、一連のファイルに対して同じスクリプトを実行します。たとえば、process.py
のすべての.png
ファイルに対して実行したい場合は、次のdir
ようにします。
find dir -name '*.png' -execdir process.py \{\} \;
結局のところ、ピケット フェンスのことは面倒です。
多くの場合find
、一連のファイルに対して同じスクリプトを実行します。たとえば、process.py
のすべての.png
ファイルに対して実行したい場合は、次のdir
ようにします。
find dir -name '*.png' -execdir process.py \{\} \;
結局のところ、ピケット フェンスのことは面倒です。
キーボードのレイアウトによっては、または"
よりも使いやすい場合があります。Unix&Linux Stack Exchangeサイトが知っている限り、はエスケープする必要はありません。エスケープする必要のあるシェルを特定することはできませんでした。manページの例では、中括弧をエスケープしていません。'
\
{}
{}
find dir -name "*.png" -execdir process.py {} ";"
Jonathan Lefflerには、最後に+が付いたソリューションがあります。これは、セマンティクスは同じではありませんが、多くの場合使用可能です。
使用する:
find dir -name '*.png' -execdir process.py {} +
エスケープする必要は{}
ありません。それらは、かなり限られた状況でのみ、シェルにとって特別な意味を持ちます。(特に、echo {}
は波括弧をエコーしますが、 はエコーしますecho {a,b,c}
。a b c
)+
もエスケープする必要はありません。find
「いじって遊ぼう」と言うxargs
。つまり、実行ごとに合理的に可能な限り多くのファイル名でコマンドを実行します。
-exec
orを使用-execdir
すると、ファイル名のスペース (およびその他の扱いにくい文字 — 改行、バックスペース、フォーム フィードなど) の問題が自動的かつ包括的に処理されることに注意してください。-print
ここで名前をにパイプするxargs
と問題が発生します。GNUfind
と GNUは、ファイル名の奇妙な文字に関する問題を回避するためのオプションとオプションをxargs
提供します。-print0
find
-0
xargs
ファイルごとに 1 回スクリプトを実行する必要がある場合は、最後にエスケープされたセミコロンが必要です。それを回避する簡単な方法はありません (あなたが数えない限り: SC=";"; find ... {} $SC
、私はしません)。
私が見る唯一の問題は-execdir
、サブディレクトリでスクリプトを実行することです。異なるディレクトリに異なるファイルがある場合に正常に動作することを確認する必要があり{}
ます-execdir
。一般に、スクリプトに付けられた名前を介してファイルを見つけることはできません)。これらはすべて「うまく機能する」はずです。
個人的にはプレーンを使いたい-exec
のですが、 を選んだのにはそれなりの理由があるのでしょう-execdir
。
'{}'';'を一重引用できます 代わりに、シェル自体がこれらの文字を解釈しないようにする必要があります。見つかった数が少ない場合は、xargsも機能します。