-execドライランを見つけますか?
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は単なるサンプルコマンドであり、一般的なケースに興味があります
回答
echo rm代わりに実行できますrm
find . type f -exec echo rm {} \;
また、見つかったファイルを削除するオプションfindがあり-deleteます
rm具体的には、あなたは必要ありません-exec。単に実行find . -type fリストに、そして追加-delete前のコマンドでリストされたファイルを削除するには、(明らかに作成されているすべての一致するファイルがなければ/その間に削除されました)。
また、のようなコマンドのためにrm任意の数の引数を取るこれを使用して、交換したいと思うでしょう\;し+、可能な限りいくつかのコマンドとして実行します。
少し一口ですが、を使用するアプローチとは異なり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代わりに使用できます。