回答:
これを行う最良の方法は、位置パラメータを使用することです。そして$()
れる好適な、それはより読みます(単一引用符と混同されていない)、簡単に脱出の多くを行うことなく、入れ子にすることができるので、コマンド置換オベバッククォートのために。
find . -exec bash -c 'echo Blah: $(stat -c %a "$@")' _ {} \;
下線はのプレースホルダーです$0
。
何のために?
find ... -printf 'Blah: %m\n'
またはbash -c
、本当に必要な場合に使用します。
find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;
bash -c
または同様の方法でシェルを呼び出す必要があります。
それらを使用する唯一の方法(AFAIK)は、それらをbashスクリプトファイルに配置し、-execでスクリプトを使用することです。同じこと$()
忘れずにxargs
!あなたの例では、見つかったファイルごとに新しいシェルプロセスを呼び出します。
私はこれを好みます:
find ... | xargs stat -c "Blah: %a"
find
見つかったすべてのリストを出力し、xargs
引数のリストを読み取りstdin
、コマンドラインでそれらの引数を使用してそのパラメーターを実行し、できるだけ長いコマンドラインを構築します。stat
他のほとんどの適切なコマンド/プログラムと同様に、任意の数のパラメーターを受け取るため、これは機能します。(比較ls
、rm
などecho
)
ファイルごとに新しいプロセスを起動することが絶対に必要だと思う場合は、各コマンドにパラメーターをxargs -n 1
渡すためだけに使用して1
ください。そうすれば、次のような非効率的なメソッドを模倣できます。
find ... | xargs -n 1 stat -c "Blah: %a"
(遅いコンピューターの大きなファイルシステムでそれを試して、違いを計ってください!)
find
で実行される前に一度評価され、その結果が検索の静的パラメーターとして使用されるため、そこでは機能しません。