見つかった各ファイルの「find -exec」拡張バックティックを取得することは可能ですか?


9

正常に動作するコマンドは次のとおりです。

echo Blah: `stat -c %a .`

の代わりにfind -exec、見つかったすべてのファイルに対してこれと同じことを実行することは可能ですか?{}.


1
バックティックはそこfindで実行される前に一度評価され、その結果が検索の静的パラメーターとして使用されるため、そこでは機能しません。
スヴェン

回答:


10

これを行う最良の方法は、位置パラメータを使用することです。そして$()れる好適な、それはより読みます(単一引用符と混同されていない)、簡単に脱出の多くを行うことなく、入れ子にすることができるので、コマンド置換オベバッククォートのために。

find . -exec bash -c 'echo Blah: $(stat -c %a "$@")' _ {} \;

下線はのプレースホルダーです$0


6

何のために?

find ... -printf 'Blah: %m\n'

またはbash -c、本当に必要な場合に使用します。

 find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;

私の差し迫った問題を解決してくれてありがとうございます。しかし、記述されているようにバックティックを使用できるかどうか知りたいと思っています。視野を広げるだけです。
RomanSt

bash -cまたは同様の方法でシェルを呼び出す必要があります。
Ignacio Vazquez-Abrams

0

それらを使用する唯一の方法(AFAIK)は、それらをbashスクリプトファイルに配置し、-execでスクリプトを使用することです。同じこと$()


0

忘れずにxargs!あなたの例では、見つかったファイルごとに新しいシェルプロセスを呼び出します。

私はこれを好みます:

find ... | xargs stat -c "Blah: %a"

find見つかったすべてのリストを出力し、xargs引数のリストを読み取りstdin、コマンドラインでそれらの引数を使用してそのパラメーターを実行し、できるだけ長いコマンドラインを構築します。stat他のほとんどの適切なコマンド/プログラムと同様に、任意の数のパラメーターを受け取るため、これは機能します。(比較lsrmなどecho

ファイルごとに新しいプロセスを起動することが絶対に必要だと思う場合は、各コマンドにパラメーターをxargs -n 1渡すためだけに使用して1ください。そうすれば、次のような非効率的なメソッドを模倣できます。

find ... | xargs -n 1 stat -c "Blah: %a"

(遅いコンピューターの大きなファイルシステムでそれを試して、違いを計ってください!)


私は努力に感謝しますが、それらのバッククォートが必要です。明らかに、私の例は単純化されており、echo + statを使用しています。実際のスクリプトはechoもstatも使用しないため、それらをstatのフォーマット文字列にまとめるトリックはまったく役に立ちません。
RomanSt、2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.