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
以确保所有结果都具有相同的数量级。
我正在尝试在 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
以确保所有结果都具有相同的数量级。