Bash 与find和du一起的奇怪行为

Bash 与find和du一起的奇怪行为,bash,find,du,Bash,Find,Du,我试图在shell脚本中的特定文件夹中生成用户使用情况,我发现find和du的组合有一些奇怪的行为 我有一个文件夹,里面有9500个文件,总共5GB。该文件夹的4GB由7个大文件组成,其余1GB由小文件组成(其中近9000个)。我遇到的问题是,我的脚本似乎忽略了大部分文件,因此du报告的总使用量是不正确的 下一行给出了文件总数的正确数字(+1): 但是,如果我只是尝试获取它返回的所有文件的总数和不正确的值 $ find . -type -f -exec du -ch {} + ...lines

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

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

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

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

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

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

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

-exec{}+
谓词不会只执行一次,它有一个大小限制,当达到该限制时,将执行命令并开始编写新的“命令”,请参见:

在我的机器上,这个尺寸大约是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 ' $2 == "total" { T+=$1 } END { print T } '

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

抱歉,我刚才问你的问题,你成功地为我解码并完美地回答了!我设法用你的输入调整了我的脚本,现在它开始工作了。在我的测试目录中,我看到命令需要执行两次。greing为“total”使其弹出!
$ 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 ' $2 == "total" { T+=$1 } END { print T } '