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

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

Я нашел вот это:

find DIR_NAME -type f ¦ wc -l

но когда я запускаю это, он возвращает следующую ошибку.

find: пути должны предшествовать выражению:/

20 ответов


это должно работать:

find DIR_NAME -type f | wc -l

объяснение:

  • -type f включить только файлы.
  • | (, а не ¦) перенаправляет find стандартный вывод команды в wc стандартный ввод команды.
  • wc (сокращенно от word count) подсчитывает новые строки, слова и байты на своем входе (docs).
  • -l считать только новая строка.

Примечания:

  • заменить DIR_NAME С . для выполнения команды в текущей папке.
  • вы также можете удалить -type f включить каталоги (и симлинки) в кол.
  • возможно, эта команда будет пересчитана, если имена файлов могут содержать символы новой строки.

объяснение, почему ваш пример не работает:

в команда, которую вы показали, вы не используете "трубу" (|) для подключения двух команд, но сломанной панели (¦) что интерпретатор не распознает как команду или что-то подобное. Вот почему вы получаете это сообщение об ошибке.


для текущего каталога:

find . -type f | wc -l

Если вы хотите разбивку, сколько файлов в каждом каталоге под вашим текущим dir:

for i in $(find . -maxdepth 1 -type d) ; do 
    echo -n $i": " ; 
    (find $i -type f | wc -l) ; 
done

что может пойти все на одной линии, конечно. Скобки уточняют, чей вывод wc -l должен смотреть (find $i -type f в данном случае).


можно использовать

$ tree

после установки дерево пакета с

$ sudo apt-get install tree

(на машине Debian / Mint / Ubuntu Linux).

команда показывает не только количество файлов, но и количество каталогов, отдельно. Параметр-L можно использовать для указания максимального уровня отображения (который по умолчанию является максимальной глубиной дерева каталогов).

скрытые файлы могут быть включены также, поставляя -a выбор.


на моем компьютере, rsync немного быстрее, чем find | wc -l в принятом ответе. Например, вы можете подсчитать файлы в /Users/joe/ такой:

[joe:~] $ rsync --stats --dry-run -ax /Users/joe/ /xxx

Number of files: 173076
Number of files transferred: 150481
Total file size: 8414946241 bytes
Total transferred file size: 8414932602 bytes

вторая строка имеет количество файлов, 150,481 в приведенном выше примере. В качестве бонуса вы получаете общий размер (в байтах).

Примечания:

  • первая строка-это количество файлов, каталогов, символических ссылок и т. д. Все вместе, поэтому она больше, чем вторая линия.
  • на --dry-run (или -n для краткости) опция важна, чтобы на самом деле не передавать файлы!
  • на /xxx параметром может быть любая пустая или несуществующая папка. Не используйте / здесь.
  • я использовал -x опция "не пересекать границы файловой системы", что означает, если вы выполняете ее для / и у вас есть внешние жесткие диски, он будет считать только файлы на корневом разделе.

объединение нескольких ответов здесь вместе, наиболее полезным решением, по-видимому, является:

find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find "{}" -printf "\n" | wc -l) "{}"' | sort -n

Он может обрабатывать нечетные вещи, такие как имена файлов, которые включают скобки пробелов и даже новые строки. Он также сортирует выходные данные по количеству файлов.

вы можете увеличить число после-maxdepth, чтобы подсчитать подкаталоги. Имейте в виду, что это может занять много времени, особенно если у вас сильно вложенная структура каталога в сочетании с высокой -maxdepth с номером.


Если вы хотите знать, сколько файлов и подкаталогов существует из настоящего рабочего каталога, вы можете использовать этот однострочный

find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find {} | wc -l) {}' | sort -n

Это будет работать в GNU flavour и просто опустить-e из команды echo для BSD linux (например, OSX).


если вы хотите избежать случаев ошибок, не позволяйте wc -l чтобы увидеть файлы с новыми строками (которые будут считаться 2+ файлами)

например, рассмотрим случай, когда у нас есть один файл с одним символом EOL в нем

> mkdir emptydir && cd emptydir
> touch $'file with EOL(\n) character in it'
> find -type f
./file with EOL(?) character in it
> find -type f | wc -l
2

по крайней мере, с gnu wc не похоже, что у вас есть возможность читать / считать список с нулевым завершением (кроме файла), самым простым решением было бы просто не передавать его имена файлов, но статический вывод каждый раз, когда файл найден, например, в том же каталог как выше

> find -type f -exec printf '\n' \; | wc -l
1

или если ваш find поддерживает

> find -type f -printf '\n' | wc -l
1 

поскольку имена файлов в UNIX могут содержать новые строки (да, новые строки), wc -l может слишком много файлов. Я бы напечатал точку для каждого файла, а затем подсчитал точки:

find DIR_NAME -type f -printf "." | wc -c

чтобы определить, сколько файлов есть в текущем каталоге, поместить в ls -1 | wc -l. Это использует wc сделать подсчет количества строк (-l) производства ls -1. Это не считается dotfiles. Обратите внимание, что ls -l (это "L", а не" 1", как в предыдущих примерах), который я использовал в предыдущих версиях этого HOWTO, фактически даст вам количество файлов на один больше, чем фактическое количество. Спасибо Кам Неджаду за это.

если вы хотите считать только файлы и не включают символические ссылки (просто пример того, что еще вы могли бы сделать), вы можете использовать ls -l | grep -v ^l | wc -l (это "L", а не" 1 "на этот раз, мы хотим" длинный " список здесь). grep проверяет наличие любой строки, начинающейся с " l " (с указанием ссылки), и отбрасывает эту строку (- v).

относительная скорость: "ls -1 / usr/ bin | /wc-l" занимает около 1,03 секунды на выгруженном 486SX25 (/usr/ bin / на этой машине имеет 355 файлов). "ls -l /usr/bin/ | grep -v ^l | wc -l" занимает около 1.19 секунды.

источник: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html


вы можете использовать команду ncdu. Он будет рекурсивно подсчитывать, сколько файлов содержит каталог Linux. Вот пример вывода:

enter image description here

Он имеет индикатор выполнения, что удобно, если у вас есть много файлов:

enter image description here

чтобы установить его на Ubuntu:

sudo apt-get install -y ncdu

Benchmark: я использовал https://archive.org/details/cv_corpus_v1.tar (380390 файлы, 11 ГБ) как папка, в которой нужно подсчитать количество файлов.

  • find . -type f | wc -l: около 1m20s для завершения
  • ncdu: около 1m20s для завершения

Я написал ffcnt для ускорения рекурсивного подсчета файлов при определенных обстоятельствах: вращающиеся диски и файловые системы, поддерживающие отображение экстента.

Он может быть на порядок быстрее, чем ls или find подходы, но YMMV.


С Баша:

создайте массив записей с помощью () и получите счетчик с #.

FILES=(./*); echo ${#FILES[@]}

Ok, который не рекурсивно подсчитывает файлы, но я хотел сначала показать простой вариант. Распространенным вариантом использования может быть создание резервных копий файла с опрокидыванием. Это создаст файл журнала.1, logfile.2, logfile.3 и т. д.

CNT=(./logfile*); mv logfile logfile.${#CNT[@]}

чтобы получить количество файлов рекурсивно, мы все еще можем использовать find таким же образом.

FILES=(`find . -type f`); echo ${#FILES[@]}

есть много правильных ответов здесь. Вот еще!

find . -type f | sort | uniq -w 10 -c

здесь . - Это папка для просмотра и 10 - количество символов, для группы справочника.


tree $DIR_PATH | tail -1

Пример Вывода:

5309 каталогов, 2122 файлов


вы можете попробовать:

find `pwd` -type f -exec ls -l {} ; | wc -l

найти-тип f / wc-l

или (если каталог является текущим каталогом)

найти . - тип f / wc-l


этот альтернативный подход с фильтрацией для формата подсчитывает все доступные модули ядра grub:

ls -l /boot/grub/*.mod | wc -l

Это будет работать совершенно нормально. Просто коротко. Если вы хотите подсчитать количество файлов в папке.

ls | wc -l

ls -l | grep -e -x -e -dr | wc -l 
  1. длинный список
  2. фильтровать файлы и dirs
  3. подсчитайте отфильтрованную строку no