ファイル拡張子を印刷するには、findで-execを使用してください。

ファイル拡張子を印刷するには、findで-execを使用してください。

私は-execfindコマンドのフラグで遊んでいます。私はかなり新しい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

関連情報