如何使用命令行计算系统中存在的所有文件/文件夹的数量?
我可以使用 GUI 找到它,只需打开整个/
文件夹的属性窗口,但如果知道如何使用命令行来执行此操作就更好了。
我是否需要一系列命令,还是只需要一个命令?
答案1
由于文件/文件夹名称可以包含换行符:
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
将为单个文件/文件夹计入两行,最终将结果打印一行。
答案2
一种方法是
sudo find / -type f | wc -l
sudo find / -type d | wc -l
(sudo 以防止访问错误)
f 代表文件,d 代表目录。
/proc/ 文件系统将会出错,但我不会考虑这些文件;)
答案3
如果你真的想要全部的文件系统中的对象数量,用于df -i
计算 inode 数量。您无法获得目录和普通文件之间的细分,但好处是它几乎可以立即运行。文件系统已经跟踪了已使用的 inode 总数。
如果您想使用基于 - 的建议之一find
,请不要仅在 上运行它。在由 或 之类的东西生成的挂载点列表上/
使用。但是,这并不排除绑定挂载,因此绑定挂载下的文件将被计算两次。 find -xdev
findmnt --list -v -U -t xfs,ext3,ext4,btrfs,vfat,ntfs -o TARGET
findmnt
很酷。
另外,当然有一种简单的方法来列出所有“磁盘”挂载,而不必列出明确的文件系统类型,但我不确定具体是什么。
正如另一个答案所建议的,使用它find -printf . | wc -c
来避免在计算文件名中的有趣字符时可能出现的问题。用于-not -type d
计算非目录文件。(您不想排除符号链接,是吗?)
答案4
使用zsh
:
与常规文件一样root
:
files=( /**/*(.D) )
这会将所有常规文件(包括以 a 开头的文件)放入.
数组中files
,现在我们可以简单地计算数组元素的数量:
echo $#files
这将处理所有边缘情况,例如不寻常的文件名。
对于目录也类似:
dirs=( /**/*(/D) )
echo $#dirs