Как я могу рекурсивно считать файлы в каталоге Linux?
Я нашел это:
find DIR_NAME -type f ¦ wc -l
Но когда я запустил это, он возвращает следующую ошибку.
find: пути должны предшествовать выражению: |
Как я могу рекурсивно считать файлы в каталоге Linux?
Я нашел это:
find DIR_NAME -type f ¦ wc -l
Но когда я запустил это, он возвращает следующую ошибку.
find: пути должны предшествовать выражению: |
Это должно работать:
find DIR_NAME -type f | wc -l
Объяснение:
-type f
включить только файлы.|
(, а не ¦
) перенаправляет стандартный вывод команды find
на стандартный ввод команды wc
.wc
(сокращение числа слов) подсчитывает новые строки, слова и байты на его входе (docs).-l
считать только символы новой строки.Примечания:
DIR_NAME
на .
, чтобы выполнить команду в текущей папке.-type f
, чтобы включить в список каталоги (и символические ссылки).Объяснение того, почему ваш пример не работает:
В команде, которую вы показали, вы не используете "Pipe" (|
) для подключения двух команд, но сломанный бар (¦
), который оболочка не распознает как команду или что-то аналогичный. Вот почему вы получаете это сообщение об ошибке.
Для текущего каталога:
find -type f | wc -l
Если вы хотите указать количество файлов в каждом каталоге под вашим текущим каталогом:
for i in */ .*/ ; do
echo -n $i": " ;
(find "$i" -type f | wc -l) ;
done
Это может идти все в одной строке, конечно. В скобках wc -l
чей вывод 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
для того, чтобы "не пересекать границы файловой системы", а это означает, что если вы выполните его для /
и у вас есть внешние жесткие диски, он будет считать только файлы в корневом разделе. Поскольку имена файлов в UNIX могут содержать переводы строк (да, переводы строк), wc -l
может считать слишком много файлов. Я бы напечатал точку для каждого файла и затем посчитал точки:
find DIR_NAME -type f -printf "." | wc -c
Комбинируя несколько ответов здесь, наиболее полезным решением является:
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 и просто опустить -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
Вы можете использовать команду ncdu
. Он будет рекурсивно подсчитывать, сколько файлов содержит каталог Linux. Вот пример вывода:
Он имеет индикатор выполнения, что удобно, если у вас много файлов:
Чтобы установить его на 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 для завершенияЧтобы определить, сколько файлов находится в текущем каталоге, введите 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
tree $DIR_PATH | tail -1
Пример вывода:
5309 каталогов, 2122 файлов
Если вам нужно рекурсивно считать определенный тип файла, вы можете сделать:
find YOUR_PATH -name '*.html' -type f | wc -l
-l
просто для отображения количества строк в выводе.
Я написал ffcnt, чтобы ускорить рекурсивный подсчет файлов при определенных обстоятельствах: вращательные диски и файловые системы, которые поддерживают отображение степени.
Он может быть на порядок быстрее, чем подходы ls
или find
, но YMMV.
С 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[@]}
Для каталогов с пробелами в имени... (на основе различных ответов выше) - рекурсивно вывести имя каталога с количеством файлов в:
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
Здесь есть много правильных ответов. Вот еще один!
find . -type f | sort | uniq -w 10 -c
где .
- это папка для поиска, а 10
- количество символов, с помощью которых можно сгруппировать каталог.
Подсчитать все папки и файлы:
ll -R | wc -l
Вы можете попробовать:
find `pwd` -type f -exec ls -l {} ; | wc -l
Этот альтернативный подход с фильтрацией по формату подсчитывает все доступные модули ядра grub:
ls -l /boot/grub/*.mod | wc -l
find -type f | wc -l
ИЛИ (Если каталог является текущим каталогом)
найти. -тип f | wc -l
ls -l | grep -e -x -e -dr | wc -l
Это будет работать совершенно нормально. Просто коротко. Если вы хотите посчитать количество файлов, присутствующих в папке.
ls | wc -l