ディレクトリに含まれるファイルのすべての一意の拡張子をリストします


10

特定のディレクトリに含まれるファイルのすべての固有の拡張子を確認したいと思います。bashでそれを行うコマンドは何ですか?

を使用find . -type fして、現在のディレクトリ内のすべてのファイルを取得し、拡張子を取り除いて、それをにパイプすることができuniqます。拡張機能を取り除く最も簡単な方法は何ですか?

回答:


14

これを試して:

find . -type f | sed -rn 's|.*/[^/]+\.([^/.]+)$|\1|p' | sort -u

それは何も出力しません:

  • 拡張子のないファイル
  • 名前がドットで終わるファイル
  • 隠しファイル

パイプでに渡すと便利な場合もありますsort | uniq -c


Macのデフォルトのsedでは動作しません。私が得るsed: illegal option -- r
dzhelil '12年

8
用途:@celil -Eの代わりに、-rOS X上で
追って通知があるまで一時停止。

3
find . -type f | sed -E 's/.+[\./]([^/\.]+)/\1/' | sort -u

拡張子のないファイルを除き、OS Xで動作します。私のダウンロードフォルダ:

DS_Store
dmg
exe
localized
msi
nib
plist
pmproj
rar
tgz
txt
webloc
zip

sed -r代わりに必要になるかもしれませんか?


軽微な問題:拡張子のないファイルに名前が表示されます。隠しファイル(など.DS_Store)は、先頭にを付けずに名前を印刷し.ます。


sort -u代わりに私はお勧めしますsort | uniq。フォークとリソース使用量が少なくなります。
John T

@Johnに感謝します。セリルの「フレームワーク」の中に収まるようにしようとしたので、私はそれを考えませんでした。
ダニエルベック

内部のドットをエスケープする必要はありません[]
追って通知があるまで一時停止。

3

埋め込まれた改行を含むファイル名に混乱せず、埋め込まれた改行を含むsort -uz可能性のあるファイル拡張子を正しくソートするために使用するさらに別のソリューションを次に示します。

# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
   printf "%s\000" "${@##*.}" # get the extensions and nul-terminate each of them
' argv0 '{}' + |
sort -uz | 
tr '\0' '\n' | 
nl

3

拡張子を取り除く簡単で覚えやすい方法は、すべてのファイル名の形式が「name.ext」であると想定し、次のように使用することです。

 ls -1 | cut -d"." -f2- | sort | uniq -c

これにより、固有の拡張機能の数がカウントされます。次に例を示します。

   1 sh  
   3 txt  
   4 txt.Z  
  17 dat  
  72 dat.gz  

1

参照してください、それがawkが好きな理由です。

find . -type f | awk -F "." '{ print $(NF) }' | sort -u
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.