【问题标题】:calculate total used disk space by files older than 180 days using find使用 find 计算超过 180 天的文件的总使用磁盘空间
【发布时间】:2013-07-02 06:59:21
【问题描述】:

我正在尝试查找特定目录中超过 180 天的文件使用的总磁盘空间。这是我正在使用的:

    find . -mtime +180 -exec du -sh {} \;

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

请注意,我只是不想为此使用脚本,如果可以为此提供一个单一的衬里,那就太好了。非常感谢任何帮助。

【问题讨论】:

  • 如果您的所有文件都可能适合一个命令行,那么这将起作用:find . -mtime +180 -exec du -ch {} \+ | tail -n1(注意\+,这意味着将所有找到的文件名作为参数 - 除非它们不会都合适,在这种情况下,尽可能少地运行命令,每次都最大化文件)。

标签: linux unix command-line


【解决方案1】:

为什么不这样?

find /path/to/search/in -type f -mtime +180 -print0 | du -hc --files0-from - | tail -n 1

【讨论】:

  • -type f 在这里也有帮助 :) find /path/to/search/in -type f -mtime +180 -print0 | du -hc --files0-from - | tail -n 1
【解决方案2】:

如果您将文件列表传递给du,它不会进行汇总。

相反,将输出通过管道传输到 cut 并让 awk 进行总结。所以你可以说:

find . -mtime +180 -exec du -ks {} \; | cut -f1 | awk '{total=total+$1}END{print total/1024}'

请注意,以人类可读格式显示结果的选项 -h 已被替换为 -k,相当于 1K 的块大小。结果以 MB 为单位显示(参见上面的total/1024)。

【讨论】:

  • 实际上du 会给你一个文件列表的总数,如果你把-c 选项传递给它,但很容易有太多的文件。
  • 应该添加-type f 否则它将包括当前目录. 总大小到结果。
  • 如果没有-type f,这会给出不正确的结果 如上所述
  • 这个解决方案有很多缺陷,永远不要使用:1)其他 cmets 中提到的错误 2)它非常慢,因为它对每个文件执行 du 3 ) awk 可能无法处理足够大的整数请将此作为已接受的答案撤消并接受 user2059857 的答案。
【解决方案3】:

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

find . -type f -mtime +356 -printf '%s\n' | awk '{total=total+$1}END{print total/1024}'

【讨论】:

    【解决方案4】:

    注意不要考虑目录的磁盘使用情况。例如,我的~/tmp 目录中有很多文件:

    $ du -sh ~/tmp
    3,7G    /home/rpet/tmp
    

    运行devnull发布的示例的第一部分以查找最近24小时内修改的文件,我们可以看到awk将汇总~/tmp目录的整个磁盘使用情况:

    $ find ~/tmp -mtime 0 -exec du -ks {} \; | cut -f1
    3849848
    84
    80
    

    但是在那段时间里只修改了一个文件,磁盘占用很少:

    $ 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
    

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

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

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

    $ find . -type f -newermt "2014-01-01" ! -newermt "2014-06-01"
    

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

    【讨论】:

    • 肯定find ... \+ 更有效率?
    • 对我来说,find . -type f -newermt "2015-08-08" ! -newermt "2016-09-09" -exec du -ks {} \; | cut -f1 | awk '{total=total+$1}END{print total/1024}' 成功了,谢谢! ;)
    【解决方案5】:

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

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

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

    【讨论】:

    • 我实际上最喜欢这个答案。对于 10 天以上的文件,我将 -mtime 修改为 -10,但你的最容易遵循。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多