「find」内でコマンド置換が機能しないのはなぜですか?


2

bashではbasename、の-execオプション内で関数を実行しようとしてfindも何もしないようです。例として:

find . -name "*pdf" -exec  echo $(basename {}) \;

ディレクトリを含むファイル名、すなわち、の結果と同じ

find . -name "*pdf" -exec  echo {} \;

なぜこれが起こるのですか?

回答:


3

$(basename {})スニペットは、前にシェルによって解析されfind実行されます。結果は{}です。そのため、2つのコマンドは同じです。

望みどおりに機能させるに$()は、独自に処理する別のシェルを作成します。で引用すると''、外部シェルの処理が妨げられます$()

find -name "*pdf" -exec sh -c 'echo $(basename "$1")' sh {} \;

注:この回答の最初のバージョンが使用されましたsh -c 'echo $(basename {})'。これは間違っていますこの他の回答をご覧ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.