Как подсчитать количество всех файлов / папок, существующих в системе, используя командную строку?
Я могу узнать это с помощью графического интерфейса, просто открыв окно свойств для всего /
, но было бы неплохо узнать, как это сделать с помощью командной строки.
Нужна ли мне целая серия команд или будет возможна только одна?
Начиная с файла / имена папок могут содержать новые строки:
sudo find / -type f -printf '.' | wc -c
sudo find / -type d -printf '.' | wc -c
Это будет считать любой файл / папка в токе /
каталог. Но поскольку muru указывает, что Вы могли бы хотеть исключить виртуальный / другие файловые системы от количества (следующее исключит любую другую смонтированную файловую систему):
find / -xdev -type f -printf '.' | wc -c
find / -xdev -type d -printf '.' | wc -c
sudo find / -type f -printf '.'
: печатает точку для каждого файла в /
;sudo find / -type d -printf '.'
: печатает точку для каждой папки в /
;wc -c
: считает количество символов.Вот пример того, как не заботящийся о новых строках в файле / имена папок могут повредить другие методы такой как, например. find / -type f | wc -l
и как использование find / -type f -printf '.' | wc -c
на самом деле делает это правильным:
% ls
% touch "file
\`dquote> with newline"
% find . -type f | wc -l
2
% find . -type f -printf '.' | wc -c
1
Если STDOUT не является терминалом, find
распечатает каждый файл / имя папки буквально; это означает, что файл / имя папки, содержащее новую строку, будет распечатан через две различных строки, и что wc -l
будет считать две строки для единственного файла / папка, в конечном счете печатая результат прочь одним.
Если Вы действительно хотите общее количество количество объектов в Ваших файловых системах, используйте df -i
для подсчета inodes. Вы не получите разбивку между каталогами и простыми файлами, но зато она работает почти немедленно. Общее количество используемого inodes - что-то, что файловые системы уже отслеживают.
, Если Вы хотите использовать один из find
- базирующиеся предложения, не просто выполните его на /
. Используйте find -xdev
в списке точек монтирования, сгенерированных чем-то как findmnt --list -v -U -t xfs,ext3,ext4,btrfs,vfat,ntfs -o TARGET
или чем-то. Это не исключает, связывают, монтируется, тем не менее, таким образом, файлы под связывают монтирование, будет считаться дважды. findmnt
довольно прохладно.
кроме того, конечно, существует простой способ перечислить весь Ваш "диск", монтируется, не имея необходимость перечислять явные типы файловой системы, но я не уверен точно что.
, Как предложено другим ответом, используйте find -printf . | wc -c
для предотвращения любых возможных проблем, считая забавные символы в именах файлов. Используйте -not -type d
для подсчета файлов некаталога. (Вы не хотите исключать свои символьные ссылки, не так ли?)
sudo find / -type f | wc -l
скажет Вам количество регулярных файлов в Вашей системе, и
sudo find / -type d | wc -l
количество папок.
1 метод был бы
sudo find / -type f | wc -l
sudo find / -type d | wc -l
(sudo для предотвращения ошибок доступа)
f для файлов, d для каталогов.
/proc/файловая система будет ошибка, но я не рассматриваю те файлы;)
Используя zsh
:
Как root
, для регулярных файлов:
files=( /**/*(.D) )
это возьмет все регулярные файлы включая тех запускающихся с .
в массив files
, теперь мы можем просто считать число элементов массива:
echo $#files
это обработает все пограничные случаи, например, необычные имена файлов.
Так же для каталогов:
dirs=( /**/*(/D) )
echo $#dirs
Другой подход, который усиливает locatedb
:
locate / | wc -l
Преимущества:
find
, основанные подходы (уже предварительно индексированный) -xdev
: т.е. пропуски специальные файлы: /dev
, /proc
и т.д. Оборотные стороны:
/tmp
, могут double-or-more-count файлы с новыми строками на их имя, например df -i
, подход