Ответ 1
Как насчет этого:
find . -type f -name '*.*' | sed 's|.*\.||' | sort -u
Какую команду или коллекцию команд можно использовать для возврата всех расширений файлов в каталог (включая подкаталоги)?
Сейчас я использую разные комбинации ls
и grep
, но я не могу найти масштабируемого решения.
Как насчет этого:
find . -type f -name '*.*' | sed 's|.*\.||' | sort -u
find . -type f | sed 's|.*\.||' | sort -u
Также работает на Mac.
если вы используете 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
Еще одно решение, использующее find (которое должно даже сортировать расширения файлов со встроенными символами новой строки правильно):
# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
printf "%s\000" "${@##*.}"
' argv0 '{}' + |
sort -uz |
tr '\0' '\n'
Boooom другое:
find * | awk -F . {'print $2'} | sort -u
ls -1 | sed 's/.*\.//' | sort -u
Обновление: Вы правы, Мэтью. На основе вашего комментария, вот обновленная версия:
ls -R1 | egrep -C 0 "[^\.]+\.[^\./:]+$" | sed 's/.*\.//' | sort -u
Я просто пытался это сделать, поскольку искал Google для хорошего ответа. Я больше Regex наклонен, чем Bash, но это также работает для подкаталогов. Я не думаю, что включает файлы без расширений:
ls -R | egrep '(\.\w+)$' -o | sort | uniq -c | sort -r