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



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



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



find DIR_NAME -type f ¦ wc -l


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




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


775   20  

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

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

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. Вот пример вывода:

enter image description here

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

enter image description here

чтобы установить его на 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 - количество символов, по которым группируется каталог.

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

Comments

    Ничего не найдено.