Я могу перечислить все каталоги по
find ./ -type d
Я попытался перечислить содержимое каждого каталога и подсчитать количество файлов в каждом каталоге, используя следующую команду
find ./ -type d | xargs ls -l | wc -l
Но это суммировало общее количество строк, возвращаемых
find ./ -type d | xargs ls -l
Есть ли способ подсчитать количество файлов в каждом каталоге?
./
?Ответы:
Предполагая, что у вас есть GNU find, позвольте ему найти каталоги, а bash сделает все остальное:
источник
find . -maxdepth 1 -type d | sort
; сделать y =find $x | wc -l
; эхо $ x, $ y; donefind . -type d -print0 | while read -d '' -r dir; do files=("$dir"/*); printf "%5d files in directory %s\n" "${#files[@]}" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find $dir -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done | sort -rn -k1
$dir
следует заключать в кавычки в первом комментарии, чтобы правильно обрабатывать имена каталогов с пробелами . :find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
Это печатает количество файлов для каждого каталога для текущего уровня каталогов:
источник
du -a | sed '/.*\.\/.*\/.*/!d' | cut -d/ -f2 | sort | uniq -c
. Добавляйте| sort -nr
для сортировки по количеству, а не по имени каталога.find. -type f
найти все элементы типа файлаcut -d/ -f2
чтобы вырезать их конкретную папкуsort
отсортировать список имен папокuniq -c
чтобы вернуть количество раз, когда каждое имя папки было подсчитаноисточник
find . -type f | cut -d/ -f2,3 | sort | uniq -c
Вы можете организовать поиск всех файлов, удалить имена файлов, оставив вам строку, содержащую только имя каталога для каждого файла, а затем подсчитать, сколько раз появляется каждый каталог:
Единственная проблема в том, что у вас есть имена файлов или каталогов, содержащие символ новой строки, что довольно маловероятно. Если вам действительно нужно беспокоиться о новых строках в именах файлов или именах каталогов, я предлагаю вам найти их и исправить, чтобы они не содержали новых строк (и незаметно убедить виновную сторону в их ошибочности).
Если вас интересует количество файлов в каждом подкаталоге текущего каталога, подсчет любых файлов в любых подкаталогах вместе с файлами в непосредственном подкаталоге, тогда я бы адаптировал
sed
команду только для печати каталог верхнего уровня:Первый шаблон фиксирует начало имени, точку, косую черту, имя до следующей косой черты и косую черту и заменяет строку только первой частью, поэтому:
заменяется на
Вторая замена захватывает файлы непосредственно в текущем каталоге; у них нет косой черты в конце, и они заменяются на
./
. Затем сортировка и подсчет работают только с количеством имен.источник
find
. Некоторые могут: если файл естьdir1/dir2/dir3/file1
, ноdir1/dir2
содержит только подкаталоги (без простых файлов), вы можете сделать вывод о его наличии. Но еслиdir1/dir4
файлов нет, его имя просто не появляется.Вот один из способов сделать это, но, вероятно, не самый эффективный.
Дает такой вывод с именем каталога, за которым следует количество записей в этом каталоге. Обратите внимание, что счетчик вывода также будет включать записи каталога, которые могут быть не такими, как вы хотите.
источник
bash
,ls
,wc
) для каждого каталога , найденногоfind
.man bash
,A -- signals the end of options and disables further option processing
. В этом случае это предотвратит включение неверно названного файла, найденного как часть поиска, в обработку аргументов для bash.У всех остальных есть тот или иной недостаток.
Пояснение:
-type d
: нас интересуют каталоги.-readable
: Они нужны нам только в том случае, если есть возможность перечислить в них файлы. Обратите внимание, чтоfind
при попытке поиска дополнительных каталогов в них по-прежнему будет выдаваться ошибка, но это предотвращает их вызов-exec
.-exec sh -c BLAH sh {} ';'
: для каждого каталога запустите этот фрагмент сценария,$0
задав значениеsh
и$1
имя файла.printf "%s " "$1"
: переносимо и минимально вывести имя каталога, за которым следует только пробел, а не новая строка.ls -1UA
: перечислить файлы, по одному в строке, в порядке каталогов (чтобы избежать остановки канала), исключая только специальные каталоги.
и..
wc -l
: подсчитать строкиисточник
find -type d -readable -exec sh -c 'ls -1UA "$1" | wc -l | tr -d "\n" ; printf "\t%s\n" "$1" ' sh {} ';' | sort -n
Слегка измененная версия ответа Себастьяна с использованием
find
вместоdu
(для исключения накладных расходов, связанных с размером файла, которыеdu
должны выполняться и никогда не используются):-mindepth 2
Параметр используется для исключения файлов в текущем каталоге. Если вы удалите его, вы увидите несколько строк вроде следующего:(как
du
вариант на основе)Если вам нужно также подсчитать файлы в текущем каталоге, используйте эту расширенную версию:
Результат будет таким:
источник
Это также можно сделать с помощью цикла по ls вместо find
for f in */; do echo "$f -> $(ls $f | wc -l)"; done
Пояснение:
for f in */;
- перебрать все каталогиdo echo "$f ->
- распечатать имя каждого каталога$(ls $f | wc -l)
- вызвать ls для этого каталога и подсчитать строкиисточник
for f ./* ; do echo $f $(ls "$f" | wc -l); done
Это должно вернуть имя каталога, за которым следует количество файлов в каталоге.
Пример вывода:
В
export -f
Требуется , поскольку-exec
аргументfind
не позволяет не выполняет функцию Баша , если вы вызываете Баш явно, и вам нужно экспортировать функцию , определенную в текущей области в новую оболочку в явном виде.источник
./dir1/dir2/dir3
(подсчет файлов вdir1
и его подкаталогов вместе, а не подсчет файловdir1/dir2/dir3
отдельно от тех, которые находятся в,dir1/dir2
и обоих отдельно от тех, в/dir1
).Я объединил ответ @glenn jackman и ответ @ pcarvalho (в списке комментариев что-то не так с ответом pcarvalho, потому что дополнительная функция управления стилем персонажа ' ' '( )).
Мой скрипт может принимать путь в качестве дополнения и сортировать список каталогов по нему, а
ls -l
также может обрабатывать проблему «места в имени файла» .Мой первый ответ в stackoverflow, и я надеюсь, что это поможет кому-то ^ _ ^
источник
найти . -тип f -printf '% h \ n' | сортировать | uniq -c
дает, например:
источник
Я пробовал с некоторыми другими здесь, но в итоге в подсчет файлов были включены подпапки, когда мне нужны были только файлы. Будет напечатано
./folder/path<tab>nnn
количество файлов, не включая вложенные папки, для каждой вложенной папки в текущей папке.источник
Простой способ рекурсивного поиска файлов заданного типа. В этом случае файлы .jpg для всех папок в текущем каталоге:
find . -name *.jpg -print | wc -l
источник
Сверхбыстрая чудо-команда, которая рекурсивно просматривает файлы, чтобы подсчитать количество изображений в каталоге и организовать вывод по расширению изображения:
Кредиты: https://unix.stackexchange.com/a/386135/354980
источник
Это мог бы быть еще один способ просмотра структур каталогов и получения результатов глубины.
источник
Я отредактировал скрипт, чтобы исключить все
node_modules
каталоги внутри анализируемого.Это можно использовать, чтобы проверить, не превышает ли количество файлов проекта максимальное количество файлов, которое может обработать средство отслеживания файлов.
Чтобы проверить максимальное количество файлов, которые может просматривать ваша система:
node_modules
Папка должна быть добавлена к исключенным путям среды IDE / редактора в медленных системах, а количество других файлов в идеале не должно превышать максимальное значение (которое можно изменить).источник
Это даст общий счет.
источник