10

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

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

5 ответов5

14

Попробуй это:

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

Он ничего не выводит для:

  • Файлы без расширения
  • Файлы с именами, заканчивающимися точкой
  • Скрытые файлы

Это также может быть полезно для sort | uniq -c .

3

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

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

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

   1 sh  
   3 txt  
   4 txt.Z  
  17 dat  
  72 dat.gz  
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
2
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) напечатать их имя без ведущих . ,

1

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .