次のように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つの文字列も多すぎます。を指定したくないので、suffix
POSIXではbasename
次のことができます。
basename string
つまり、毎回1つの文字列が呼び出されますbasename
。basename
各パス名に対して別々の呼び出しを呼び出す構文は次find
のとおりです。
find … -exec basename {} \;
(読む-exec
オプションについて学ぶfind
;
と)の違いを求めます+
。
GNU、ast-open、toybox、およびFreeBSDの実装は、少なくともbasename
サポート(GNUとast-openのエイリアス-a
)を使用しています。取り外して使用してください。)例:--multiple
basename
--all
-exec … +
find
suffix
-s …
find … -exec basename -a {} +
ただし、GNUシステムを使用している場合は、既に検索されたファイルfind
のデフォルト名(予告編)をその述語で印刷できます(GNUが/をbasename
追加する-a
数十年前でした--multiple
)-printf
。
find … -printf '%f\n'
zsh 再帰 globbing では、:t
glob 修飾子に修飾子 (1970 年代後半の csh 記録およびパラメーター拡張に由来) を使用して、t
次のパスに関するすべての情報を取得できます。
print -rC1 -- test_folder/**/*(ND.:t)
(sと同等のN
ullglobおよびD
otglob修飾子もあります)。.
find
-type f
1 厳密に言えば、ほとんどのユーティリティと同様に、--
オプションの終了も許可します。ただし、POSIXがこれにオプションを指定しなくても同じですbasename
。 forまたはinで始まらないと保証できない場合に使用できますbasename -- -file-.jpg .jpg
。basename -- "$file"
$file
-