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

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

Я нашел это:

find DIR_NAME -type f ¦ wc -l

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

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

Ответ 1

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

find DIR_NAME -type f | wc -l

Объяснение:

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

Примечания:

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

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

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

Ответ 2

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

find -type f | wc -l

Ответ 3

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

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

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

Ответ 4

Вы можете использовать

$ tree

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

$ sudo apt-get install tree

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

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

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

Ответ 5

На моем компьютере 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 для того, чтобы "не пересекать границы файловой системы", а это означает, что если вы выполните его для / и у вас есть внешние жесткие диски, он будет считать только файлы в корневом разделе.

Ответ 6

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

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

Ответ 7

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

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

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

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

Ответ 8

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

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

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

Ответ 9

Если вы хотите избежать ошибок, не разрешайте 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 

Ответ 10

Вы можете использовать команду 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 файлов, 11 ГБ) в качестве папки, в которой нужно посчитать количество файлов.

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

Ответ 11

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

Если вы хотите считать только файлы и НЕ включать символические ссылки (просто пример того, что еще вы могли бы сделать), вы могли бы использовать 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

Ответ 12

tree $DIR_PATH | tail -1

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

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

Ответ 13

Если вам нужно рекурсивно считать определенный тип файла, вы можете сделать:

find YOUR_PATH -name '*.html' -type f | wc -l 

-l просто для отображения количества строк в выводе.

Ответ 14

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

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

Ответ 15

С bash:

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

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

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

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

Рекурсивный подсчет с включенным globstar bash 4+ (как упомянуто @tripleee)

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

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

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

Ответ 16

Для каталогов с пробелами в имени... (на основе различных ответов выше) - рекурсивно вывести имя каталога с количеством файлов в:

find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done

Пример (отформатирован для удобства чтения):

pwd
  /mnt/Vancouver/Programming/scripts/claws/corpus

ls -l
  total 8
  drwxr-xr-x 2 victoria victoria 4096 Mar 28 15:02 'Catabolism - Autophagy; Phagosomes; Mitophagy'
  drwxr-xr-x 3 victoria victoria 4096 Mar 29 16:04 'Catabolism - Lysosomes'

ls 'Catabolism - Autophagy; Phagosomes; Mitophagy'/ | wc -l
  138

## 2 dir (one with 28 files; other with 1 file):
ls 'Catabolism - Lysosomes'/ | wc -l
  29

Структура каталогов лучше визуализируется с помощью tree:

tree -L 3 -F .
  .
  ├── Catabolism - Autophagy; Phagosomes; Mitophagy/
  │   ├── 1
  │   ├── 10
  │   ├── [ ... SNIP! (138 files, total) ... ]
  │   ├── 98
  │   └── 99
  └── Catabolism - Lysosomes/
      ├── 1
      ├── 10
      ├── [ ... SNIP! (28 files, total) ... ]
      ├── 8
      ├── 9
      └── aaa/
          └── bbb

  3 directories, 167 files

man find | grep mindep
  -mindepth levels
    Do not apply any tests or actions at levels less than levels
    (a non-negative integer).  -mindepth 1 means process all files
    except the starting-points.

ls -p | grep -v/ ls -p | grep -v/ (используется ниже) ls -p | grep -v/ из ответа 2 на https://unix.stackexchange.com/questions/48492/list-only-regular-files-but-not-directories-in-current-directory

find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done
./Catabolism - Autophagy; Phagosomes; Mitophagy: 138
./Catabolism - Lysosomes: 28
./Catabolism - Lysosomes/aaa: 1

Applcation: я хочу найти максимальное количество файлов среди нескольких сотен каталогов (все глубины = 1) [вывод ниже снова отформатирован для удобства чтения]:

date; pwd
    Fri Mar 29 20:08:08 PDT 2019
    /home/victoria/Mail/2_RESEARCH - NEWS

time find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done > ../../aaa
    0:00.03

[[email protected] 2_RESEARCH - NEWS]$ head -n5 ../../aaa
    ./RNA - Exosomes: 26
    ./Cellular Signaling - Receptors: 213
    ./Catabolism - Autophagy; Phagosomes; Mitophagy: 138
    ./Stress - Physiological, Cellular - General: 261
    ./Ancient DNA; Ancient Protein: 34

[[email protected] 2_RESEARCH - NEWS]$ sed -r 's/(^.*): ([0-9]{1,8}$)/\2: \1/g' ../../aaa | sort -V | (head; echo ''; tail)

    0: ./Genomics - Gene Drive
    1: ./Causality; Causal Relationships
    1: ./Cloning
    1: ./GenMAPP 2
    1: ./Pathway Interaction Database
    1: ./Wasps
    2: ./Cellular Signaling - Ras-MAPK Pathway
    2: ./Cell Death - Ferroptosis
    2: ./Diet - Apples
    2: ./Environment - Waste Management

    988: ./Genomics - PPM (Personalized & Precision Medicine)
    1113: ./Microbes - Pathogens, Parasites
    1418: ./Health - Female
    1420: ./Immunity, Inflammation - General
    1522: ./Science, Research - Miscellaneous
    1797: ./Genomics
    1910: ./Neuroscience, Neurobiology
    2740: ./Genomics - Functional
    3943: ./Cancer
    4375: ./Health - Disease 

sort -v является естественной сортировкой.... Итак, мое максимальное количество файлов в любой из этих папок (Claws Mail) составляет 4375 файлов. Если я оставил объявление -p (fooobar.com/questions/27361/...) этими именами файлов - все они имеют числовые имена, начиная с 1, в каждом каталоге - и добавив до 5 общих цифр, я должен будет хорошо.


добавление

Найти общее количество файлов, подкаталогов в каталоге.

$ date; pwd
Tue 14 May 2019 04:08:31 PM PDT
/home/victoria/Mail/2_RESEARCH - NEWS

$ ls | head; echo; ls | tail
Acoustics
Ageing
Ageing - Calorie (Dietary) Restriction
Ageing - Senescence
Agriculture, Aquaculture, Fisheries
Ancient DNA; Ancient Protein
Anthropology, Archaeology
Ants
Archaeology
ARO-Relevant Literature, News

Transcriptome - CAGE
Transcriptome - FISSEQ
Transcriptome - RNA-seq
Translational Science, Medicine
Transposons
USACEHR-Relevant Literature
Vaccines
Vision, Eyes, Sight
Wasps
Women in Science, Medicine

$ find . -type f | wc -l
70214    ## files

$ find . -type d | wc -l
417      ## subdirectories

Ответ 17

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

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

где . - это папка для поиска, а 10 - количество символов, с помощью которых можно сгруппировать каталог.

Ответ 18

Подсчитать все папки и файлы:

ll -R | wc -l

Ответ 19

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

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

Ответ 20

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

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

Ответ 21

find -type f | wc -l

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

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

Ответ 22

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

Ответ 23

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

ls | wc -l