ベース名{} .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 {} \;
_をパイプする必要がありますか?
試してください:
_find -iname "*.txt" -exec sh -c 'for f do basename -- "$f" .txt;done' sh {} +
_
_{}
_をリテラルとして扱う$(...)
がサブシェルで実行されるため、最初のコマンドは失敗しました。したがって、_basename {} .txt
_ return _{}
_、あなたのfind
は次のようになります。
_find . -iname "*.txt" -exec echo {} \;
_
一致する印刷ファイル名。
代わりに、bashパイプラインとxargs
コマンドを使用する別の方法があります。
find . -iname '*.txt' | xargs -L1 -I{} basename "{}"
上記のxargs
コマンドでは:
-L1
引数は、find
コマンドの出力を1行ずつ実行することを意味します。
-I{}
引数は、find
コマンドの出力を二重引用符で囲み、bashワード分割を回避します(ファイル名に空白が含まれている場合)。