-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
代わりに使用できます。