我编写了一个简单的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,输出应该排序。
答案 0 :(得分:9)
使用du -h
和sort -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