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

fra*_*ure 4 files

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

Gra*_*eme 6

根据您要计算的确切内容,您最好按文件系统执行此操作而不是计算 root 下的所有文件。计数下根的一切也算/proc/sys你可能不希望包含的文件。

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

find / -xdev -type f -printf '\n' | wc -l
Run Code Online (Sandbox Code Playgroud)

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

使用 POSIX find,您可以简单地执行以下操作:

find / -xdev -type f | wc -l
Run Code Online (Sandbox Code Playgroud)

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

{ printf 0; find / -xdev -type f -exec sh -c 'printf "+ $#"' sh {} +; echo; } | bc
Run Code Online (Sandbox Code Playgroud)

这里每个文件变成一个不同的参数sh,然后打印参数的总数。如果sh调用了多个进程,就像许多文件一样,每个sh输出都在bc.

更新

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

find / -xdev -type f -exec printf '%s\0' {} + | tr '\n\0' '?\n' | wc -l
Run Code Online (Sandbox Code Playgroud)

更新 2

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

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

find / -xdev -type f -printf '%i\n' | sort -u | wc -l
Run Code Online (Sandbox Code Playgroud)

使用 POSIX 工具:

find / -xdev -type f -exec ls -iq {} + | sort -buk 1,1 | wc -l
Run Code Online (Sandbox Code Playgroud)

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