Basename を find とともに使用すると、追加のオペランドが検出されます。

Basename を find とともに使用すると、追加のオペランドが検出されます。

次のようにfindを介してbasenameを実行してみました。

find ./test_folder -type f -exec basename {} +

ただし、次のエラーが発生します。

basename: extra operand './test_folder/test/file.crt'

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

ベストアンサー1

POSIXbasenameこれだけがサポートされています:

basename string [suffix]

POSIXは、3つ以上の文字列が提供されたときに何が起こるかを指定しませんが、ほとんど(すべてではありません)実装で構文エラーが発生します。extra operandあなたは一つを得る。

suffixしかし、あなたの場合、2番目の文字列は削除される文字列として解釈されるため、2つの文字列も多すぎます。を指定したくないので、suffixPOSIXではbasename次のことができます。

basename string

つまり、毎回1つの文字列が呼び出されますbasenamebasename各パス名に対して別々の呼び出しを呼び出す構文は次findのとおりです。

find … -exec basename {} \;

(読む-execオプションについて学ぶfind;と)の違いを求めます+

GNU、ast-open、toybox、およびFreeBSDの実装は、少なくともbasenameサポート(GNUとast-openのエイリアス-a)を使用しています。取り外して使用してください。)例:--multiplebasename--all-exec … +findsuffix-s …

find … -exec basename -a {} +

ただし、GNUシステムを使用している場合は、既に検索されたファイルfindのデフォルト名(予告編)をその述語で印刷できます(GNUが/をbasename追加する-a数十年前でした--multiple-printf

find … -printf '%f\n'

zsh 再帰 globbing では、:tglob 修飾子に修飾子 (1970 年代後半の csh 記録およびパラメーター拡張に由来) を使用して、t次のパスに関するすべての情報を取得できます。

print -rC1 -- test_folder/**/*(ND.:t)

(sと同等のNullglobおよびDotglob修飾子もあります)。.find-type f


1 厳密に言えば、ほとんどのユーティリティと同様に、--オプションの終了も許可します。ただし、POSIXがこれにオプションを指定しなくても同じですbasename。 forまたはinで始まらないと保証できない場合に使用できますbasename -- -file-.jpg .jpgbasename -- "$file"$file-

おすすめ記事