-execドライランを見つけますか?

Dec 27 2020

find . -exec somecommand {} \;実際にコマンドを実行せずに、置換を使用した場合の結果を確認する方法はありますか?ドライラン(またはテストランや印刷)のように?

たとえば、次のファイル構造があるとします。

/a/1.txt
/a/2.txt
/a/b/3.txt

次のように、出力がstdoutに出力されるが実行されないようにfind . type f -exec rm {} \;aディレクトリ内からテストする方法はありますか?

rm 1.txt
rm 2.txt
rm b/3.txt

更新注:これrmは単なるサンプルコマンドであり、一般的なケースに興味があります

回答

18 rAlen Dec 27 2020 at 07:10

echo rm代わりに実行できますrm

find . type f -exec echo rm {} \;

また、見つかったファイルを削除するオプションfindがあり-deleteます

3 l0b0 Dec 27 2020 at 07:28

rm具体的には、あなたは必要ありません-exec。単に実行find . -type fリストに、そして追加-delete前のコマンドでリストされたファイルを削除するには、(明らかに作成されているすべての一致するファイルがなければ/その間に削除されました)。

また、のようなコマンドのためにrm任意の数の引数を取るこれを使用して、交換したいと思うでしょう\;+、可能な限りいくつかのコマンドとして実行します。

2 CharlesDuffy Dec 28 2020 at 00:38

少し一口ですが、を使用するアプローチとは異なりecho、以下の出力コードは、ファイル名に引用符、スペース、シェルメタ文字などが含まれている場合でも、変更なしでシェルで実行して正しい結果を得ることができます。

printcmd() { printf '%q ' "$@"; printf '\n'; } find . -exec bash -c "$(declare -f printcmd); "'printcmd "$@"' _ \
  somecommand {} \;

-exec引数の前に付ける文字列は正確にbash -c "$(declare -f printcmd); "'printcmd "$@"' _-$(declare -f printcmd)関数のコードに展開されることに注意してください。その後、実際に引数$1などを使用して関数を呼び出し_のプレースホルダーとして配置し$0ます。

そのシェルの出力をエスケープしたい場合は、bashの代わりにzshまたはksh代わりに使用できます。