私は-exec
findコマンドのフラグで遊んでいます。私はかなり新しいLinuxディストリビューションを使用してファイル拡張子を印刷するためにこのフラグを使用しようとしています。
簡単に始めると、次のように動作します。
find . -type f -exec echo {} \;
便利なBash文字列関数を使用しようとして失敗しました。
find . -type f -exec echo "${{}##*.}" \; (bad substitution)
それでは、正しいアプローチは何ですか?
答え1
シェルパラメータ拡張を使用するには、次のようにいくつかのシェルを実行しますexec
。
find . -type f -exec sh -c 'echo "${0##*.}"' {} \;
答え2
find . -type f | while read file; do echo "${file##*.}"; done
誰もが覚えられないトリッキーなexec構文をすべてバイパスできるという利点があります。
また、見つかったファイルごとに1つのサブプロセスを作成および削除するのではなく、1つのサブプロセスのみを作成できるという利点もあります。これはexecを使用するjimmijのバージョンよりはるかに高速です。
# Preparation - 1000 files
for i in {1..1000}; do touch $i.$i; done
>time find . -type f -exec sh -c 'echo "${0##*.}"' {} \;
real 0m21.906s
user 0m6.013s
sys 0m12.304s
>time find . -type f | while read file; do echo "${file##*.}"; done
real 0m0.219s
user 0m0.125s
sys 0m0.087s