使用find计算超过180天的文件的总使用磁盘空间

dig*_*123 20 unix linux command-line

我试图找到特定目录中超过180天的文件使用的总磁盘空间.这就是我正在使用的:

    find . -mtime +180 -exec du -sh {} \;
Run Code Online (Sandbox Code Playgroud)

但上面很安静,显然给了我找到的每个文件使用的磁盘空间.我只想要文件使用的总添加磁盘空间.可以使用findexec命令完成吗?

请注意,我根本不想使用脚本,如果可以有一个内衬,这将是很好的.任何帮助都非常感谢.

dev*_*ull 16

du 如果您将文件列表传递给它,则不会总结.

相反,将输出管道输入cutawk总结.所以你可以说:

find . -mtime +180 -exec du -ks {} \; | cut -f1 | awk '{total=total+$1}END{print total/1024}'
Run Code Online (Sandbox Code Playgroud)

请注意,-h以人类可读格式显示结果的选项已被替换-k为等于1K的块大小.结果以MB表示(见total/1024上文).

  • 应该添加`-type f`否则它将包括当前目录`.`总大小到结果. (3认同)
  • 这个解决方案有很多缺陷,应该永远不会使用:1)其他评论中提到的Bug 2)它非常*很慢,因为它为每个文件执行du 3)awk可能无法处理足够大的整数*请将此作为已接受的答案*撤销,并接受user2059857的答复. (3认同)
  • **这会产生不正确的结果** 没有上面建议的 `-type f` (2认同)

use*_*857 15

为什么不呢?

find /path/to/search/in -mtime +180 -print0 | du -hc --files0-from - | tail -n 1
Run Code Online (Sandbox Code Playgroud)

  • -type f在这里也有帮助:)`find / path / to / search / in -type f -mtime +180 -print0 | du -hc --files0-from-| 尾-n 1` (2认同)

rpe*_*pet 7

之前的答案很好,但它有一个问题:它会多次使用相同的磁盘使用量,因为它会考虑目录磁盘的使用情况.

例如,我的目录中有很多文件~/tmp:

$ du -sh ~/tmp
3,7G    /home/rpet/tmp
Run Code Online (Sandbox Code Playgroud)

运行devnull发布的示例的第一部分来查找过去24小时内修改的文件,我们可以看到awk将该~/tmp目录的整个磁盘使用量相加:

$ find ~/tmp -mtime 0 -exec du -ks {} \; | cut -f1
3849848
84
80
Run Code Online (Sandbox Code Playgroud)

但是在这段时间内只修改了一个文件,磁盘使用率非常低:

$ find ~/tmp -mtime 0
/home/rpet/tmp
/home/rpet/tmp/kk
/home/rpet/tmp/kk/test.png

$ du -sh ~/tmp/kk
84K /home/rpet/tmp/kk
Run Code Online (Sandbox Code Playgroud)

所以我们只需要考虑文件并排除目录:

$ find ~/tmp -type f -mtime 0 -exec du -ks {} \; | cut -f1 | awk '{total=total+$1}END{print total/1024}'
0.078125
Run Code Online (Sandbox Code Playgroud)

您还可以使用-newermt参数指定日期范围.例如:

$ find . -type f -newermt "2014-01-01" ! -newermt "2014-06-01"
Run Code Online (Sandbox Code Playgroud)

访问http://www.commandlinefu.com/commands/view/8721/find-files-in-a-date-range


Pet*_*erT 6

您可以find使用该-printf选项打印文件大小,但仍然需要awk求和。

例如,超过 365 天的所有文件的总大小:

find . -type f -mtime +356 -printf '%s\n' \
     | awk '{a+=$1;} END {printf "%.1f GB\n", a/2**30;}'
Run Code Online (Sandbox Code Playgroud)


k-h*_*k-h 6

@PeterT是正确的。几乎所有这些答案都会为每个文件调用一个命令(du),这非常耗费资源,而且速度慢且不必要。最简单,最快的方法是:

find . -type f -mtime +356 -printf '%s\n' | awk '{total=total+$1}END{print total/1024}'
Run Code Online (Sandbox Code Playgroud)