如何从 root 开始计算系统上的所有文件?

如何从 root 开始计算系统上的所有文件?

我想知道我的服务器上的文件总数。这可以做到吗?

答案1

根据您具体想要计算的内容,您最好这样做每个文件系统而不是计算根目录下的所有文件。计算 root 下的所有内容也会计算您可能不希望包含的文件/proc/sys

要使用 GNU 对根文件系统上的所有内容进行计数find,您可以执行以下操作:

find / -xdev -type f -printf '\n' | wc -l

-printf '\n'只会为找到的每个文件打印换行符,而不是文件名。这样,包含换行符本身的文件名就不会出现问题,并且会被视为多个文件。

通过 POSIX find,您可以简单地执行以下操作:

find / -xdev -type f | wc -l

或者 POSIXly 并避免任何包含换行符的文件被计算两次:

{ printf 0; find / -xdev -type f -exec sh -c 'printf "+ $#"' sh {} +; echo; } | bc

这里每个文件变成一个不同的参数,sh然后打印参数的总数。如果sh调用多个进程(如许多文件的情况),则每个sh输出都将汇总在bc.

更新

一个更简单(但更慢)的 POSIX 解决方案:

find / -xdev -type f -exec printf '%s\0' {} + | tr '\n\0' '?\n' | wc -l

更新2

正如所指出的@吉尔斯,使用-type fwithfind只计算常规文件。要还包含设备文件,您可以使用-type f -o -type b -o -type c.要对目录进行计数,请不要使用任何-type选项。

Gilles 的另一点是,具有多个硬链接的文件将被视为不同的文件。这在文件系统上可能是不理想的,例如,增量备份树是通过将较新树中未更改的文件硬链接到较旧树中的文件来创建的。要使用 GNU 工具克服这个问题,您可以这样做:

find / -xdev -type f -printf '%i\n' | sort -u | wc -l

使用 POSIX 工具:

find / -xdev -type f -exec ls -iq {} + | sort -buk 1,1 | wc -l

这里文件名中的换行符没有问题,因为-q选项ls意味着它将用?.

答案2

df -i /给你使用的数量索引节点在根文件系统上(在使用 inode 的文件系统上,包括 ext2/ext3/ext4 系列,但不包括 btrfs)。这是该文件系统上的文件数量,加上一些预先分配以供使用的索引节点FSCK

如果您想要目录树中的文件数量,则可以使用以下命令:

du -a /some/directory | wc -l

如果您不想遍历挂载点,请添加该选项-x,例如。请注意,如果您的文件名包含换行符,这将返回更大的计数(这是一个坏主意,但并非不可能)。dudu -ax / | wc -l

另一种计数方法是

find /some/directory | wc -l

或者,为了处理包含换行符的文件名,请使用 GNU find(非嵌入式 Linux 或 Cygwin):

find /some/directory -printf . | wc -c

添加-xdev(例如find /some/directory -xdev -printf .)以跳过安装点。请注意,此目录项,而不是文件:如果一个文件有多个硬链接,则每个链接都被计数(而dfdu方法对文件进行计数,即同一文件的多个硬链接仅计数一次)。

答案3

更新

这是我能想象的最快的方法,可以完全移植。我使用tar下面的方法是因为它只会自动添加一次硬链接文件:

   find /./ -xdev ! -type d | tar -cf - - | tar -t | sed -n '\|^/\./|c.' | wc -l

便携且速度非常快:

find / -xdev | sed -n '/^[./]/c\.' | wc -l

我不相信你确实需要其余的所有内容 - 尽管@Graeme 关于下面可能的遗漏是正确的。然而,这并不具有同样的缺点:

find /./ -xdev | sed -n '\|^/\./|c.' | wc -l

您需要做的就是确保有完整的根路径,而不必跳过所有其他障碍。

笔记:正如吉尔斯指出的那样,使用-f型是一个严重的错误。我更新了这篇文章以反映这一点。

另外,为了更准确的计数,您只需执行以下操作:

du / --inodes -xs

如果您的工具是最新的,这将为您提供根文件系统中的确切文件数量。这也可以用于任何目录。

这是一种仅使用非常常用的工具即可获取任何文件系统或子目录中所有文件(不包括硬链接)的准确计数的方法。首先用away隔离目标根mount --bind

mkdir /tmp/ls ; sudo mount -B / $_ ; cd $_

接下来,计算您的文件数:

sudo ls -ARUi1 ./ | 
grep -o '^ *[0-9]*' | 
sort -un | 
wc -l

我做了一些与此非常相似的事情另一个答案几天前 - 尽管这有点复杂,因为目标是按包含最高文件计数的子目录进行排序 - 因此那里的命令看起来与这里的命令有点不同。但顺便说一句,这仍然非常快。

无论如何,它的核心是ls命令。它-Recursively搜索整个树,每行列出一个文件。然后-Almost-all -inodes -Unsorted我们 检查inode和-1grep -only[0-9]numbers, sort-unique -numberswcount -lines.

答案4

从你的根目录:

find . -type f | wc -l

您可以将路径(此处。)更改为您想要计算文件数量的目录。如果您不想进入子目录,请添加选项-maxdepth 1

相关内容