Подтвердить что ты не робот

Как найти все расширения файлов рекурсивно из каталога?

Какую команду или коллекцию команд можно использовать для возврата всех расширений файлов в каталог (включая подкаталоги)?

Сейчас я использую разные комбинации ls и grep, но я не могу найти масштабируемого решения.

4b9b3361

Ответ 1

Как насчет этого:

find . -type f -name '*.*' | sed 's|.*\.||' | sort -u

Ответ 2

find . -type f | sed 's|.*\.||' | sort -u

Также работает на Mac.

Ответ 3

если вы используете Bash 4 +

shopt -s globstar
for file in **/*.*
do
  echo "${file##*.}
done

Рубин (1.9 +)

ruby -e 'Dir["**/*.*"].each{|x|puts x.split(".")[-1]}' | sort -u

Ответ 4

Еще одно решение, использующее find (которое должно даже сортировать расширения файлов со встроенными символами новой строки правильно):

# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
  printf "%s\000" "${@##*.}"
' argv0 '{}' + |
sort -uz | 
tr '\0' '\n'

Ответ 5

Boooom другое:

find * | awk -F . {'print $2'} | sort -u

Ответ 6

ls -1 | sed 's/.*\.//' | sort -u

Обновление: Вы правы, Мэтью. На основе вашего комментария, вот обновленная версия:

ls -R1 | egrep -C 0 "[^\.]+\.[^\./:]+$" | sed 's/.*\.//' | sort -u

Ответ 7

Я просто пытался это сделать, поскольку искал Google для хорошего ответа. Я больше Regex наклонен, чем Bash, но это также работает для подкаталогов. Я не думаю, что включает файлы без расширений:

ls -R | egrep '(\.\w+)$' -o | sort | uniq -c | sort -r