Список усіх унікальних розширень для файлів, що містяться в каталозі


11

Я хотів би побачити все унікальне розширення файлів, що містяться в певному каталозі. Яка команда робити це в баші?

Можна було find . -type fб отримати всі файли в поточному каталозі, а потім витягнути розширення та передати його uniq. Який найпростіший спосіб зняти розширення?

Відповіді:


15

Спробуйте це:

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

Він нічого не видає для:

  • Файли без розширення
  • Файли з іменами, які закінчуються крапкою
  • Приховані файли

Це також може бути корисно передавати його sort | uniq -c.


Не працює з sed за замовчуванням на моєму Mac. Я отримуюsed: illegal option -- r
джеліл

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. Намагався триматися в рамках "Целіла", тому я не думав про це.
Даніель Бек

Не потрібно уникати крапки всередині [].
Призупинено до подальшого повідомлення.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.