Как найти все расширения файлов рекурсивно из каталога? - PullRequest
38 голосов
/ 15 февраля 2011

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

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

Ответы [ 8 ]

57 голосов
/ 15 февраля 2011

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

find . -type f -name '*.*' | sed 's|.*\.||' | sort -u
3 голосов
/ 13 октября 2012
find . -type f | sed 's|.*\.||' | sort -u

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

1 голос
/ 16 мая 2018

список всех расширений и их количество текущих и всех подкаталогов

ls -1R | sed 's/[^\.]*//' | sed 's/.*\.//' | sort | uniq -c
0 голосов
/ 10 февраля 2015

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

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

0 голосов
/ 04 октября 2014
ls -1 | sed 's/.*\.//' | sort -u

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

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

0 голосов
/ 27 июня 2014

Boooom другой:

find * | awk -F . {'print $2'} | sort -u
0 голосов
/ 15 февраля 2011

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

# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
  printf "%s\000" "${@##*.}"
' argv0 '{}' + |
sort -uz | 
tr '\0' '\n'
0 голосов
/ 15 февраля 2011

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

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

Ruby (1.9 +)

ruby -e 'Dir["**/*.*"].each{|x|puts x.split(".")[-1]}' | sort -u
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...