2

多くの場合find、一連のファイルに対して同じスクリプトを実行します。たとえば、process.pyのすべての.pngファイルに対して実行したい場合は、次のdirようにします。

find dir -name '*.png' -execdir process.py \{\} \;

結局のところ、ピケット フェンスのことは面倒です。

4

3 に答える 3

5

キーボードのレイアウトによっては、または"よりも使いやすい場合があります。Unix&Linux Stack Exchangeサイトが知っている限り、はエスケープする必要はありません。エスケープする必要のあるシェルを特定することはできませんでした。manページの例では、中括弧をエスケープしていません。'\{}{}

find dir -name "*.png" -execdir process.py {} ";"

Jonathan Lefflerには、最後に+が付いたソリューションがあります。これは、セマンティクスは同じではありませんが、多くの場合使用可能です。

于 2012-04-25T17:13:04.413 に答える
5

使用する:

find dir -name '*.png' -execdir process.py {} +

エスケープする必要は{}ありません。それらは、かなり限られた状況でのみ、シェルにとって特別な意味を持ちます。(特に、echo {}は波括弧をエコーし​​ますが、 はエコーしますecho {a,b,c}a b c)+もエスケープする必要はありません。find「いじって遊ぼう」と言うxargs。つまり、実行ごとに合理的に可能な限り多くのファイル名でコマンドを実行します。

-execorを使用-execdirすると、ファイル名のスペース (およびその他の扱いにくい文字 — 改行、バックスペース、フォーム フィードなど) の問題が自動的かつ包括的に処理されることに注意してください。-printここで名前をにパイプするxargsと問題が発生します。GNUfindと GNUは、ファイル名の奇妙な文字に関する問題を回避するためのオプションとオプションをxargs提供します。-print0find-0xargs

ファイルごとに 1 回スクリプトを実行する必要がある場合は、最後にエスケープされたセミコロンが必要です。それを回避する簡単な方法はありません (あなたが数えない限り: SC=";"; find ... {} $SC、私はしません)。

私が見る唯一の問題は-execdir、サブディレクトリでスクリプトを実行することです。異なるディレクトリに異なるファイルがある場合に正常に動作することを確認する必要があり{}ます-execdir。一般に、スクリプトに付けられた名前を介してファイルを見つけることはできません)。これらはすべて「うまく機能する」はずです。

個人的にはプレーンを使いたい-execのですが、 を選んだのにはそれなりの理由があるのでしょう-execdir

于 2012-04-25T17:04:37.410 に答える
0

'{}'';'を一重引用できます 代わりに、シェル自体がこれらの文字を解釈しないようにする必要があります。見つかった数が少ない場合は、xargsも機能します。

于 2012-04-25T17:07:03.057 に答える