命令打印出大文件,排序,大小为人类可读格式

时间:2012-01-20 14:45:19

标签: linux bash

我编写了一个简单的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,输出应该排序。

3 个答案:

答案 0 :(得分:9)

使用du -hsort -h

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

<强>说明:

  • du -h file1 file2 ... h uman可读格式打印 d isk u sage。
  • sort -hr r 顺序排序 h uman可读数字(首先是较大的数字)。
  • +的选项find -exec将减少命令du的调用次数,从而加快执行速度。此处+可以替换为';'

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

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

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

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

注意: -h的{​​{1}}选项已于2009年推出,因此旧版发行版(如Red Hat 5)可能无法使用此选项。此外,sort的选项+在较旧的发行版(如Red Hat 4)中不可用。


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

ls

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

<强>说明:

  • ls每行显示一个文件
  • find /your/dir -type f -size +5M -print0 | xargs -0 ls -1Ssh 按文件大小排序
  • ls -1打印文件大小
  • ls -S以人类可读的格式打印尺寸

最快的命令可能正在使用上面的ls -s ls -h选项ls -1Ssh,但如上所述,文件数量必须是可接受的,只能调用+一次为了保证按大小排序find -exec的{​​{1}}选项与ls的工作方式非常相似)。

+

要减少找到的文件数量,您可以增加阈值大小:例如,将find -exec替换为xargs

答案 1 :(得分:6)

find ... | sort -rn | cut -d\  -f2 | xargs df -h

例如:)或

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

(从olibre借来一点灵感。)

答案 2 :(得分:0)

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

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