Перечислите все уникальные расширения для файлов, содержащихся в каталоге

11

Я хотел бы видеть все уникальные расширения файлов, содержащихся в определенном каталоге. Какова команда, чтобы сделать это в Bash?

Можно использовать, 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. Меньше разветвления и использования ресурсов.
Джон Т
Спасибо @Джон. Пытался уложиться в «рамки» celil, поэтому я не думал об этом.
Даниэль Бек
Нет необходимости избегать точки внутри [].
Приостановлено до дальнейшего уведомления.
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
tooly
источник
3

Быстрый и простой способ запомнить расширение состоит в том, чтобы предположить, что все имена файлов имеют формат «name.ext», а затем использовать:

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

это дает количество уникальных расширений, например:

   1 sh  
   3 txt  
   4 txt.Z  
  17 dat  
  72 dat.gz  
jcloos
источник
1

вот почему я люблю awk:

find . -type f | awk -F "." '{ print $(NF) }' | sort -u
bankman
источник