Відповіді:
Спробуйте це:
find . -type f | sed -rn 's|.*/[^/]+\.([^/.]+)$|\1|p' | sort -u
Він нічого не видає для:
Це також може бути корисно передавати його sort | uniq -c
.
-E
замість -r
OS X.
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
. Менше роздрібнення та використання ресурсів.
[]
.
Ось ще одне рішення, яке не плутається з іменами файлів, що містять вбудовані нові рядки, і використовує 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
Швидкий і легкий для запам'ятовування спосіб зняття розширення - це передбачити, що всі назви файлів мають формат "name.ext", а потім використовувати:
ls -1 | cut -d"." -f2- | sort | uniq -c
це дає підрахунок кількості унікальних розширень, наприклад:
1 sh
3 txt
4 txt.Z
17 dat
72 dat.gz
sed: illegal option -- r