Я сделал очистку сайта для проекта конверсии. Я хотел бы сделать некоторую статистику по типам файлов там - например, 400 .html
файлов, 100 .gif
и т. Д. Какой простой способ сделать это? Это должно быть рекурсивно.
Редактировать: со сценарием, который выложил maxschelpzig, у меня возникли некоторые проблемы из-за архитектуры сайта, которую я добавил. Некоторые из файлов имеют имена *.php?blah=blah&foo=bar
с различными аргументами, поэтому он считает их уникальными. Таким образом, решение должно рассматриваться *.php*
как одно и то же, так сказать.
*.php?blah=blah&foo=bar
с различными аргументами, поэтому он считает их уникальными. Как я могу изменить его, чтобы искать*.php*
?sed 's/^.*\(\.[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]\).*$/\1/'
find -name '.*' -prune -o -type f -print
оценивается следующим образом: если запись в каталоге совпадает,.*
то следует удалить ее, в противном случае, если это файл, распечатать его. Так как.*
также совпадает.
, т.е. CWD, все сокращено, то есть find даже не спускается в первый каталог. Возможно, 2-летние версииfind
вели себя по-другому - или тогда это был просто недосмотр. Во всяком случае,find -name '.*' -not -name . -prune -o -type f -print
исправляет это.С зш:
Модель
**/?*.*
соответствует всем файлам , которые имеют расширение, в текущем каталоге и его подкаталогах рекурсивно. Спецификатор globD
позволяетzsh
обходить даже скрытые каталоги и рассматривать скрытые файлы,.
выбирая только обычные файлы. Модификатор История сохраняет только расширение файла.print -rl
печатает по одному совпадению на строку.uniq -c
считает последовательные идентичные элементы (результат глобуса уже отсортирован). Последний вызовsort
сортирует расширения по количеству использования.источник
Этот однострочник кажется довольно надежным методом:
В
find . -type f -printf '%f\n'
печатает BASENAME каждого обычного файла в дереве, без каталогов. Это избавляет от необходимости беспокоиться о каталогах, которые могут быть.
в них в вашемsed
регулярном выражении.sed -r -n 's/.+(\..*)$/\1/p'
Заменяет входящее имя файла только с его расширением. Например,.somefile.ext
становится.ext
. Обратите внимание на инициал.+
в регулярном выражении; это приводит к тому, что для любого соответствия требуется хотя бы один символ перед расширением.
. Это предотвращает.gitignore
обращение с такими именами файлов , как отсутствие имени и расширение «.gitignore», что, вероятно, вам и нужно. Если нет, то замените.+
с.*
.Остальная часть строки от принятого ответа.
Изменить : Если вы хотите хорошо отсортированную гистограмму в формате диаграммы Парето , просто добавьте другую
sort
в конец:Пример вывода из встроенного дерева исходных текстов Linux:
источник
Я поместил bash-скрипт в мою
~/bin
папкуexhist
с таким содержимым:В каком бы каталоге я ни находился, я просто набираю 'exh', вкладка автоматически завершает его, и я вижу что-то вроде этого:
PS Обрезка части после знака вопроса должна быть проста для выполнения другой командой sed, вероятно, после последней (я не пробовал):
sed 's/\?.*//'
источник