Рекурсивный подсчет файлов в директории Linux
Как можно рекурсивно подсчитать количество файлов в директории Linux?
Я нашел следующее решение:
find DIR_NAME -type f ¦ wc -l
Но когда я пытаюсь его запустить, возникает следующая ошибка:
find: пути должны предшествовать выражению: ¦
5 ответ(ов)
Чтобы посчитать количество файлов в текущем каталоге, можно использовать следующую команду в терминале:
find . -type f | wc -l
Здесь find . -type f
ищет все файлы (-type f
) в текущем каталоге и его подкаталогах. Затем результат передается в команду wc -l
, которая подсчитывает количество строк, что соответствует количеству найденных файлов. Обратите внимание, что точка (.
) указывает на текущую директорию.
На моем компьютере rsync
оказывается немного быстрее, чем find | wc -l
, как указано в принятом ответе:
$ rsync --stats --dry-run -ax /path/to/dir /tmp
Number of files: 173076
Number of files transferred: 150481
Total file size: 8414946241 bytes
Total transferred file size: 8414932602 bytes
Во второй строке указано количество файлов, в данном примере это 150481. В качестве бонуса также отображается общий размер (в байтах).
Некоторые замечания:
- Первая строка является общим количеством файлов, директорий, символических ссылок и т. д. вместе взятых, поэтому она больше второй строки.
- Важно использовать опцию
--dry-run
(или короткую-n
), чтобы не выполнять фактическую передачу файлов! - Я использовал опцию
-x
, чтобы "не пересекать границы файловой системы", что означает, что если вы выполните это для/
, а у вас подключены внешние жесткие диски, то подсчитываться будут только файлы на корневом разделе.
Если вы хотите получить количество файлов в каждой папке под текущей директорией, вы можете использовать следующий скрипт:
for i in */ .*/ ; do echo -n $i": " ; (find "$i" -type f | wc -l) ; done
Этот код можно записать в одну строку. Скобки нужны для того, чтобы было понятно, вывод какого именно выражения ожидается командой wc -l
(в данном случае - это результат find $i -type f
).
Вы можете использовать команду
$ tree
после установки пакета tree с помощью команды
$ sudo apt-get install tree
(на системах Linux Debian / Mint / Ubuntu).
Эта команда показывает не только количество файлов, но и количество директорий отдельно. Опция -L позволяет указать максимальный уровень отображения (по умолчанию это максимальная глубина дерева директорий).
Также можно включить скрытые файлы, добавив опцию -a
.
В UNIX имена файлов могут содержать символы новой строки (да, именно новые строки), поэтому команда wc -l
может посчитать файлов больше, чем есть на самом деле. Чтобы обойти эту проблему, можно вывести точку для каждого файла и затем посчитать точки:
find DIR_NAME -type f -printf "." | wc -c
Обратите внимание: опция -printf
работает только с утилитой find
из набора GNU findutils. Возможно, вам потребуется установить её, например, на Mac.
Как изменить цвет вывода echo в Linux
Как перенаправить вывод в файл и на экран (stdout)
Как запросить ввод Yes/No/Cancel в скрипте оболочки Linux?
Как работает "cat << EOF" в bash?
Как использовать 'grep' для непрерывного потока?