命令打印出大小的文件,并以大小可读的格式进行sorting

我写了一个简单的shell脚本来查找大型文件,主要是为了节省一些input。 工作正在完成:

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

我想把字节输出转换成可读的格式。 我在网上find了如何手动执行此操作的方法,例如,

 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 } }}' 

但是,这似乎凌乱。 我想知道: 是否有一个标准的方法来将字节转换成人类可读的forms

当然,也欢迎以目录和最小尺寸作为input,生成以下输出的其他方法:

  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上工作,输出应该被sorting。

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

比如:)或者

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

(从olibre借来的一点启发)。

du -hsort -h

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

说明:

  • du -h file1 file2 ...以给定文件的人可读格式打印文件。
  • sort -hr顺序sort -hr可读的数字(大数字在前)。
  • find -exec的选项+会减少command du的调用次数,因此会加快执行速度。 这里+可以替换为';'

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

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

或者,如果你只想要十大文件:

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

注意: 2009年左右已经推出了选项-h ,因此这个选项可能不适用于旧发行版(如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+选项,但是如上所述,为了保证按大小排序 ,文件数量必须是可接受的,以保证按大小排序find -exec option +工作就像xargs )。

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

为了减少找到的文件数量,可以增加阈值大小:例如,用+100M代替+5M