Daftar semua ekstensi unik untuk file yang terdapat dalam direktori

10

Saya ingin melihat semua ekstensi unik dari file yang terkandung dalam direktori tertentu. Apa perintah untuk melakukan itu di bash?

Orang bisa menggunakan find . -type funtuk mendapatkan semua file di direktori saat ini, kemudian menghapus ekstensi, dan pipa ke uniq. Apa cara termudah untuk menghapus ekstensi?

dzhelil
sumber

Jawaban:

14

Coba ini:

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

Tidak menghasilkan apa-apa untuk:

  • File tanpa ekstensi
  • File dengan nama yang diakhiri dengan titik
  • File tersembunyi

Mungkin juga berguna untuk menyalurkannya sort | uniq -c.

Dijeda sampai pemberitahuan lebih lanjut.
sumber
Tidak berfungsi dengan sed default di Mac saya. Saya mendapatkansed: illegal option -- r
dzhelil
8
@celil: Gunakan -Esebagai ganti -rOS X.
Dijeda sampai pemberitahuan lebih lanjut.
3
find . -type f | sed -E 's/.+[\./]([^/\.]+)/\1/' | sort -u

Bekerja pada OS X, kecuali untuk file tanpa ekstensi. Folder unduhan saya:

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

Anda mungkin membutuhkannya sed -r?


Masalah kecil: File tanpa ekstensi mencetak nama mereka. File tersembunyi (seperti .DS_Store) mencetak nama mereka tanpa harus memimpin ..

Daniel Beck
sumber
Saya akan merekomendasikan sort -ubukannya sort | uniq. Kurang forking dan penggunaan sumber daya.
John T
Terima kasih @ john Mencoba untuk tetap berada dalam "kerangka" celil, jadi saya tidak memikirkannya.
Daniel Beck
Tidak perlu melarikan diri dari titik di dalam [].
Dijeda sampai pemberitahuan lebih lanjut.
3

Berikut ini solusi lain yang tidak perlu bingung dengan nama file yang mengandung baris baru yang disematkan dan digunakan sort -uzuntuk mengurutkan ekstensi file yang benar yang mungkin telah menyertakan baris baru juga:

# [^.]: 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
berguna
sumber
3

Cara cepat dan mudah diingat untuk menghapus ekstensi adalah dengan mengasumsikan semua nama file memiliki format "name.ext" lalu gunakan:

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

ini menghitung jumlah ekstensi unik yang ada, misalnya:

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

lihat, itu sebabnya saya suka awk:

find . -type f | awk -F "." '{ print $(NF) }' | sort -u
bankir
sumber