【问题标题】:command to print out large files, sorted, with sizes in human readable format命令打印出大文件,排序,大小为人类可读格式
【发布时间】:2018-05-16 15:00:15
【问题描述】:

我编写了一个简单的 shell 脚本来查找大文件,主要是为了节省自己的打字时间。正在完成这项工作:

find $dir -type f -size +"$size"M -printf '%s %p\n' | sort -rn

我想将字节输出转换为人类可读的格式。我在网上找到了如何手动执行此操作的方法,例如,

find $dir -type f -size +"$size"M -printf '%s %p\n' | sort -rn |
   awk '{ hum[1024**4]="TB"; hum[1024**3]="GB"; hum[1024**2]="MB"; hum[1024]="KB"; hum[0]="B";
      for (x=1024**4; x>=1024; x/=1024){
         if ($1>=x) { printf "%7.2f %s\t%s\n",$1/x,hum[x],$2;break }
      }}'

但这似乎很混乱。我想知道:是否有将字节转换为人类可读形式的标准方法

当然,任何产生以下输出的替代方法,给定一个目录和最小大小作为输入,也是受欢迎的:

   1.25 GB      /foo/barf
 598.80 MB      /foo/bar/bazf
 500.58 MB      /bar/bazf
 421.70 MB      /bar/baz/bamf
 ...

注意:这必须在 2.4 和 2.6 上都有效,并且输出应该是排序的。

【问题讨论】:

  • 当你有-type f时为什么它会列出目录?
  • 它没有。我只是打了个例子,没有想太多;)

标签: linux bash


【解决方案1】:

使用du -hsort -h

find /your/dir -type f -size +5M -exec du -h '{}' + | sort -hr

说明:

  • du -h file1 file2 ... 以给定文件的h人类可读格式打印disk usage。
  • sort -hrr 逆序对 h 人类可读的数字进行排序(较大的数字在前)。
  • find -exec 的选项+ 将减少命令du 的调用次数,从而加快执行速度。这里+可以替换成';'

如果您希望最后打印较大的文件,您可以删除sort 命令的选项-r。您甚至可以使用更简单的以下命令,但您的终端窗口缓冲区可能已被填满!

find /your/dir -type f -exec du -h '{}' + | sort -h

或者,如果您只想要前十个较大的文件:

find /your/dir -type f -exec du -h '{}' + | sort -hr | head

注意: 选项 -hsort 大约在 2009 年引入,因此该选项在旧发行版(如 Red Hat 5)上可能不可用。此外,find -exec 的选项 + 在较旧的发行版(如 Red Hat 4)上也不可用。


在旧发行版上,您可以使用 xargs 代替 find -exec 的选项 +。命令ls 也可用于打印已排序的文件。但是为了保证按大小排序xargs 必须只调用一次ls。如果您的文件数量可以接受,xargs 只能调用一次 ls:这取决于传递给 ls 参数的文本长度(所有文件名长度的总和)。

find /your/dir -type f -size +5M -print0 | xargs -0 ls -1Ssh

(从MichaelKrelin-hacker借了一点灵感)。

说明:

  • ls -1 每行显示一个文件
  • ls -S 按文件大小排序
  • ls -s 打印文件大小
  • ls -h 以人类可读的格式打印尺寸

最快的命令可能是使用上述ls -1Sshfind -exec+ 选项,但如上所述,文件的数量必须是可接受的,以便仅调用一次ls 以保证排序按大小find -exec 的选项+ 的工作方式与xargs 大致相同)。

find /your/dir -type f -size +5M -exec ls -1Ssh '{}' +

要减少找到的文件数量,您可以增加阈值大小:例如,将 +5M 替换为 +100M

【讨论】:

  • 感谢您的回答。我希望输出按字节大小排序,这就是为什么我正在寻找一种将字节转换为人类可读的方法(因为我无法通过 find)。
  • 嗨@user112358132134。我添加了选项-Sls 命令)=> 文件按大小排序:-)
  • 等等。这仅适用于 -exec+,并且(遗憾的是)这将需要在没有它的旧系统上工作。
  • @user112358132134 正如我在回答中所说:在旧系统上使用';' 而不是'+'(如果sed 版本早于4.1.5
  • 对,我说它不起作用时的意思是 排序 不起作用。
【解决方案2】:
find ... | sort -rn | cut -d\  -f2 | xargs df -h

例如 :) 或

find $dir -type -f size +$size -print0 | xargs -0 ls -1hsS

(从olibre借了一点灵感)。

【讨论】:

  • 非常好,但我相信这会破坏名称中带有空格的文件。
  • 当然,但可以通过将-d \n 选项传递给xargs 来轻松修复
  • cut 截断路径/文件名,而不是 xargs
  • @user112358132134,我刚刚添加了另一个战斗空间选项。但我认为对于大量文件,第一个版本更好。我不知道你有多少。
  • cut -f2- -d ' ' 是我*要寻找的东西
【解决方案3】:

在当前目录中查找大于 10Mb 的文件,并以人类可读的形式按大小排序

find . -type f -size +10M | xargs du -sh | sort -rn

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-10
    • 2013-02-17
    • 2010-09-09
    • 2017-08-09
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多