我写了一个简单的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 -h
和sort -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 -1Ssh
和find -exec
的+
选项,但是如上所述,为了保证按大小排序 ,文件数量必须是可接受的,以保证按大小排序 ( find -exec
option +
工作就像xargs
)。
find /your/dir -type f -size +5M -exec ls -1Ssh '{}' +
为了减少找到的文件数量,可以增加阈值大小:例如,用+100M
代替+5M
。