Рекурсивный подсчет файлов в каталоге 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
включить каталоги (и симлинки) в кол. - возможно, эта команда будет пересчитана, если имена файлов могут содержать символы новой строки.
объяснение, почему ваш пример не работает:
в команда, которую вы показали, вы не используете "трубу" (|
) для подключения двух команд, но сломанной панели (¦
) что интерпретатор не распознает как команду или что-то подобное. Вот почему вы получаете это сообщение об ошибке.
Если вы хотите разбивку, сколько файлов в каждом каталоге под вашим текущим 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. Вот пример вывода:
Он имеет индикатор выполнения, что удобно, если у вас есть много файлов:
чтобы установить его на 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
- количество символов, для группы справочника.
этот альтернативный подход с фильтрацией для формата подсчитывает все доступные модули ядра grub:
ls -l /boot/grub/*.mod | wc -l
Это будет работать совершенно нормально. Просто коротко. Если вы хотите подсчитать количество файлов в папке.
ls | wc -l
ls -l | grep -e -x -e -dr | wc -l
- длинный список
- фильтровать файлы и dirs
- подсчитайте отфильтрованную строку no