web-dev-qa-db-ja.com

find -execでベース名を使用しますか?

ベース名{} .txtを使用するだけで機能します。

_find . -iname "*.txt" -exec basename {} .txt \;
_

./xxx.txtの代わりにxxxを出力します

-execオプションで$(basename {} .txt)を使用したい場合、失敗します。

_find . -iname "*.txt" -exec echo "$(basename {} .txt)" \;
_

./xxx.txtを出力します

この問題を解決するにはどうすればよいですか? $(basename {} .txt)を他のcmdのパラメーターとして使用できるといいのですが。 _sh -c_を実行するか、xargsで_-exec basename {} \;_をパイプする必要がありますか?

4
Wang

試してください:

_find -iname "*.txt" -exec sh -c 'for f do basename -- "$f" .txt;done' sh {} +
_

_{}_をリテラルとして扱う$(...)がサブシェルで実行されるため、最初のコマンドは失敗しました。したがって、_basename {} .txt_ return _{}_、あなたのfindは次のようになります。

_find . -iname "*.txt" -exec echo {} \;
_

一致する印刷ファイル名。

6
cuonglm

代わりに、bashパイプラインとxargsコマンドを使用する別の方法があります。

    find . -iname '*.txt' | xargs -L1 -I{} basename "{}"

上記のxargsコマンドでは:

-L1引数は、findコマンドの出力を1行ずつ実行することを意味します。

-I{}引数は、findコマンドの出力を二重引用符で囲み、bashワード分割を回避します(ファイル名に空白が含まれている場合)。

1
an9wer