find 和 du 的奇怪行为

Strange behavoir with find and du

我正在尝试在 shell 脚本中的某些文件夹中生成用户使用情况,但我发现我的 find 和 du 组合有一些奇怪的行为。

我有一个包含约 9500 个文件的文件夹,总共 5GB。该文件夹的 4GB 由 7 个大文件组成,其余 1GB 由小文件(近 9000 个)组成。我遇到的问题是我的脚本似乎忽略了大部分文件,因此 du 报告的总使用量不正确。

下一行给出了文件总数的正确数字(总数+1):

$ find . -type -f -exec du -ch {} + | wc -l
9596

但是,如果我只是尝试获取所有文件的总数,它 returns 和不正确的值。

$ find . -type -f -exec du -ch {} + 
...lines of files
139M total < this value is incorrect, should be ~5GB

如果我将大小限制为大文件(超过 25MB),它确实会拾取大文件并靠近,但显然缺少构成剩余 1GB 的许多小文件。

$ find . -type -f -size +25M -exec du -ch {} + 
561M    ./largefile0
483M    ./largefile1
514M    ./largefile2
948M    ./largefile3
360M    ./largefile4
768M    ./largefile5
764M    ./largefile6
4.3G    total < this is the correct total for these files

最后,更奇怪的是,如果我再次 运行 没有大小参数的命令,然后 grep large 它会选择 largefile[0-6] 文件。

$ find . -type -f -size +25M -exec du -ch {} + | grep large
561M    ./largefile0
483M    ./largefile1
514M    ./largefile2
948M    ./largefile3
360M    ./largefile4
768M    ./largefile5
764M    ./largefile6

所以我不太确定这里发生了什么,就好像 du 可以报告的文件总数是有限制的,但对于这个数据集来说它似乎总是等于 139M。

不清楚你在问什么。如果只是对结果的解释,那么:

-exec {} + 谓词不只执行一次,它有大小限制,当达到大小限制时,将执行命令并开始组合新的 "command" 参见:https://git.savannah.gnu.org/cgit/findutils.git/tree/find/exec.c#n153

在我的机器上,大小是 ~128K。

$ find ./ -type f -name 'file*' -exec echo {} + 2>/dev/null | head -1 | wc -c
131056

对于包含大约 40000 个文件的示例目录,命令执行了 7 次。

$ find ./ -type f -name 'file*' -exec echo {} + | wc -l
7

如果我限制文件的数量,它适合一个:

$ find ./ -type f -name 'file5*' -exec echo {} + | wc -l
1

如果你想得到最终的总文件大小:

find ./ -type f -name 'file*' -exec du -ck {} + | awk '  == "total" { T+= } END { print T } '

请注意,我使用 k 而不是 h 以确保所有结果都具有相同的数量级。