Рекурсивный поиск файлов в списке каталогов

Как рекурсивно подсчитать файлы в списке каталогов Linux?

Пример:

/dog/
  /a.txt
  /b.txt
  /c.ipynb

/cat/
  /d.txt
  /e.pdf
  /f.png
  /g.txt

/owl/
  /h.txt

Я хочу следующий вывод:

5 .txt
1 .pynb
1 .pdf
1 .png

Я пробовал следующее, но безуспешно.

find . -type f | sed -n 's/..*\.//p' | sort | uniq -c

Что не работает? Вам не хватает точки перед расширениями файлов или вы хотите, чтобы вывод был отсортирован в числовом виде?

Cyrus 20.12.2020 15:36
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
1
120
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Это find + gawk может сработать для вас:

find . -type f -print0 |
awk -v RS='\0' -F/ '{sub(/^.*\./, ".", $NF); ++freq[$NF]} END {for (i in freq) print freq[i], i}'

Безопасно использовать -print0 в find для обработки файлов с пробелами и другими специальными символами. Точно так же мы используем -v RS='\0' в awk, чтобы гарантировать, что байт NUL является разделителем записи.

Используйте однострочники Perl, чтобы сделать вывод в нужном вам формате, например:

find . -type f | perl -pe 's{.*[.]}{.}' | sort | uniq -c | perl -lane 'print join "\t", @F;' | sort -nr

Однострочник Perl использует следующие флаги командной строки: -e: говорит Perl искать код в строке, а не в файле. -n : перебирать ввод по одной строке за раз, назначая его $_ по умолчанию. -p : перебирать ввод по одной строке за раз, назначая его $_ по умолчанию. Добавляйте print $_ после каждой итерации цикла. -l: удалите разделитель строк ввода (по умолчанию "\n" в *NIX) перед выполнением кода в строке и добавьте его при печати. -a : разделить $_ на массив @F по пробелам или по регулярному выражению, указанному в опции -F.

СМОТРИТЕ ТАКЖЕ: perldoc perlrun: как запустить интерпретатор Perl: переключатели командной строки perldoc perlrequick: быстрое начало работы с регулярными выражениями Perl

Предположим, у вас есть известный каталог path со следующими подкаталогами foo, bar, baz, qux, quux, gorge, и мы хотим подсчитать типы файлов на основе расширения, но только для подкаталогов foo, baz и qux

Лучше всего просто сделать

$ find /path/{foo,baz,qux} -type f -exec sh -c 'echo "${0##*.}"' {} \; | sort | uniq -c

Часть exec просто использует простую замену переменной sh для печати расширения.

Другие вопросы по теме