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?

Jawaban:



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 ..


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

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  

1

lihat, itu sebabnya saya suka awk:

find . -type f | awk -F "." '{ print $(NF) }' | sort -u
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.