20 ответов:
это должно работать:
find DIR_NAME -type f | wc -lобъяснение:
-type fвключить только файлы.|(, а не¦) перенаправляетfindстандартный вывод команды вwcстандартный ввод команды.wc(сокращение от word count) подсчитывает новые строки, слова и байты на его входе (docs).-lпосчитать просто новая строка.Примечания:
- заменить
DIR_NAMEС.для выполнения команды в текущей папке.- вы также можете удалить
-type fдля включения каталогов (и символических ссылок) в счетчик.- возможно, эта команда будет перерасчет, если имена файлов могут содержать символы новой строки.
объяснение, почему ваш пример не работает:
в команда, которую вы показали, вы не используете "трубу" (
|) к виду-соедините две команды, но сломанный бар (¦) что интерпретатор не распознает как команду или что-то подобное. Вот почему вы получаете это сообщение об ошибке.
Если вы хотите разбивку, сколько файлов находится в каждом каталоге под вашим текущим каталогом:
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 в приведенном выше примере. В качестве бонуса вы получаете общий размер (в байтах).
Примечания:
- первая строка-это количество файлов, каталогов, символических ссылок и т. д. Все вместе, поэтому она больше, чем вторая линия.
- the
--dry-run(или-nдля краткости) опция важна, чтобы на самом деле не передавать файлы!- the
/xxxпараметром может быть любая пустая или несуществующая папка. Не используйте/здесь.- я использовал
-xопция "не пересекать границы файловой системы", что означает, если вы выполняете его для/и у вас есть внешние жесткие диски, он будет считать только файлы на корневом разделе.
объединяя несколько ответов здесь вместе, наиболее полезным решением кажется:
find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find "{}" -printf "\n" | wc -l) "{}"' | sort -nОн может обрабатывать странные вещи, такие как имена файлов, содержащие пробелы, скобочки и даже новые линии. Он также сортирует вывод по количеству файлов.
вы можете увеличить число после-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
бенчмарк: я использовал https://archive.org/details/cv_corpus_v1.tar (380390 files, 11 GB) как папка, в которой нужно подсчитать количество файлов.
find . -type f | wc -l: около 1m20s для завершенияncdu: около 1m20s для завершения
Я написал ffcnt для ускорения рекурсивного подсчета файлов при определенных обстоятельствах: вращающиеся диски и файловые системы, поддерживающие отображение экстента.
Он может быть на порядок быстрее, чем
lsилиfindподходы, но YMMV.
С Баша:
создайте массив записей с помощью () и получите счетчик с помощью #.
FILES=(./*); echo ${#FILES[@]}хорошо, что не рекурсивно подсчитывает файлы, но я хотел сначала показать простой вариант. Распространенным вариантом использования может быть создание резервных копий файла с опрокидыванием. Это создаст файл журнала.1, лог.2, журнал.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


Comments