【问题标题】:total size of all files smaller than所有文件的总大小小于
【发布时间】:2017-09-24 00:25:25
【问题描述】:

所以我正在计划备份,子目录中有数千个文件,我知道最大的只是我不需要备份的数据集,而不是我创建的东西。

我发现这个有用的命令here 列出了大于或小于给定大小的所有内容:

如果我这样做:

find . -type f -size +1000M

它只列出了 4 个文件,但对于 +100M,大约有 30 个。我可以浏览一下,看看是否有什么重要的东西需要保留并相应地调整阈值。

想要一个总大小,所以我知道它是否都适合 25 或 100MB 的光盘..

所以我尝试像这样将它通过管道传输到du,但它似乎不起作用,即给我说找到的 4 个文件的总数:

find . -type f -size +1000M | du

有谁知道如何做到这一点?

(是的,当然会将 + 更改为 - ,小于不大于之前查看的数字,但在查看 30 个文件而不是数千个文件时更容易查看它是否有效)。

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    您可以使用-printf 运行find,它有很多选项可以控制打印的内容(记录在here)。因此,您可以打印每个文件,然后打印它使用了多少 1 KB 磁盘块,其中:

    find . -type f -size +1000M -printf '%p %k\n'
    

    一旦你这样做了,用awk 对它们求和比用du 更容易:

    find . -type f -size +1000M -printf '%p %k\n'  | awk 'BEGIN{total=0}{total += $2}END{print total}'
    

    这是因为du 只接受以NUL (ASCII 0) 结尾的输入列表。所以你必须这样做:

    find . -type f -size +1000M -printf '%p\0' | du -k --files0-from=- --total
    

    然后查看最后一行“total”。但是NUL-terminated 文件名列表不便于查看;没有用户名,文件名看起来一起运行。

    【讨论】:

    • 谢谢,你的中间命令产生了一个非常优雅的输出。谢天谢地,您的示例和@Kent 都产生了相同的数字,但尽管这是一个看起来很讨厌的命令,但您编写的输出是完全干净的。不知道你们在哪里学的这个 bash 的东西,我时不时需要它,可能得研究一下..
    【解决方案2】:
     du --total $(find . -type f -size +1000M)  
    

    会帮助你。

    【讨论】:

      【解决方案3】:

      为了确定某些文件是否适合其他媒体,您必须考虑其他媒体的块大小。仅仅总结每个文件的字节是不够的,因为每个文件在最后一个块中浪费了磁盘空间。浪费的空间量取决于块大小。

      来自我的虚拟机主目录的示例:

      $ du -hs .
      619M    .
      $ du -bhs .
      598M    .
      

      这些文件有 598M 大,但它们在磁盘上使用了 619M。大约 20M 被浪费了。

      【讨论】:

      • 谢谢,是的,已经注意到了。蓝光光盘说从媒体大小中扣除5%并且不超过这可能是可以的。有趣的是看到有这样的命令行工具..
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      相关资源
      最近更新 更多