find . -exec somecommand {} \;
実際にコマンドを実行せずにaを変更した結果が何であるかを確認する方法はありますか?テスト実行(またはテスト実行または印刷)が好きですか?
たとえば、次のようなファイル構造があるとします。
/a/1.txt
/a/2.txt
/a/b/3.txt
find . type f -exec rm {} \;
出力はstdoutとして印刷されますが、実行されないようにディレクトリ内でa
テストする方法はありますか?例:
rm 1.txt
rm 2.txt
rm b/3.txt
修正する
注:rm
これは単なるサンプルコマンドであり、一般的なケースに興味があります。
答え1
echo rm
代わりに走ることができます。rm
find . type f -exec echo rm {} \;
また、見つかったファイルを削除するオプションもfind
あります。-delete
答え2
特に、次のrm
作業は必要ありません-exec
。 listを実行してfind . -type f
から-delete
前のコマンドでリストされたファイルを削除するには、追加します(明らかに一致するファイルを同時に作成/削除することはできません)。
また、このように引数の数に関係なく使用するコマンドの場合は、できるだけ少ない数のコマンドを実行するように置き換える必要がrm
あります。\;
+
答え3
これは少し複雑ですが、使用されている方法とは異なり、以下の出力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
。
シェルの出力をエスケープするには、zsh
bashの代わりにまたはを使用できます。ksh