http://blog.chinaunix.net/u/6542/showart.php?id=394070
使用 du -sh * 可以显示指定目录下各文件/目录的大小情况,但是输出结果不够人性化(human-readable),以 /usr/share/目录为例
du -sh /usr/share/* 会输出如下信息
654K /usr/share/aclocal
141K /usr/share/aclocal-1.9
318K /usr/share/alsa
145K /usr/share/applications
1.9M /usr/share/audacious
170K /usr/share/audacious-plugins
24K /usr/share/aumix
1.2M /usr/share/autoconf
926K /usr/share/automake-1.9
如果要非常直观地按大到小显示个文件目录的大小,我们可以使用脚本来完成,对 du 后的信息进行处理后再按照要求输出,比如只输出大小在多少M以上的目录信息
这是很久以前的一个脚本,这几天正好有时间,就整理了下。
#!/usr/bin/perl
## filename: dfdir.pl ## script for getting file list of specified directory, ## then output them in order by size.
## Powered by Muddyboot, last modified: 2005-04-26 ## only accept one parameter
$basename=substr($0,rindex($0,'/')+1); sub usage()
{ print "/nUsage: $basename DIRECTORY [MIN-SIZE]/n/n"; print "Get file list of DIRECTORY, then output them in order by size./n"; print "If MIN-SIZE is specified, only print those greater than MIN-SIZE./n"; print "MIN-SIZE is non-zero integer optionally followed by a k/K/m/M./n/n"; exit; }
sub print_err ()
{ die "/n/e[1;31m$_[0]/e[0;39m/n/n";
}
die &usage
if (@ARGV)
< 1 ; if ($ARGV[0]
eq '-h'
or $ARGV[0]
eq '-help'
or $ARGV[0]
eq '--help')
{ &usage; }
## delete the last slash in dirname ($dir=$ARGV[0])
=~ s@/$@@;
## check if exists &print_err("ERROR: destination: $dir does not exist.")
if !
-e $dir;
## check if is a directory &print_err("ERROR: destination: $dir is not an directory.")
if !
-d $dir;
## get the filelist length and count the max length opendir DH,"$dir"
or die
"/nCannot open directory: $dir/n/n"; $maxlen=0;
foreach $file
(readdir DH)
{ $curlen=length($file)+length($dir)+1; if ($curlen
> $maxlen)
{ $maxlen=$curlen; } } closedir DH;
## min size parameter control
if ($ARGV[1]
ne ""
){ $msize=$ARGV[1]; if ($msize
!~
/^[0-9]+$/
and $msize
!~
/^[0-9]+[kKMm]$/
or $msize
== 0
) { &usage; } elsif
($msize
=~
/[mM]$/)
{ $msize
=~ s/[mM]$//;
$msize
*= 1024; } }
## get dir usage information open INFO,"du -s $dir/*|sort -rn|"
or &print_err("ERROR: Cannot open $dir.");
## process information and output while (<INFO>)
{ chomp; my($size,$file)=/(/S+)/s+(.*)/; if ($size
> 1024*1024
and $size
> $msize)
{ printf "%5.1fG/t%s/n",$size/1024/1024,$file; } elsif ($size
> 1024 and
$size >
$msize)
{ printf "%5.1fM/t%s/n",$size/1024,$file; } elsif ($size
> $msize)
{ printf "%5dK/t%s/n",$size,$file; } else
{ last; } }
|
运行方式:dfdir.pl <目录名> [整数][k/m]
例子1:排序显示 /usr/share 下所有文件目录大小信息
dfdir.pl /usr/share
例子2:显示 /usr/share 下大于 5M 的文件或目录信息
dfdir.pl /usr/share 5m
输出结果如下:
113.6M /usr/share/fonts
50.1M /usr/share/man
32.5M /usr/share/gtk-doc
18.9M /usr/share/info
17.9M /usr/share/themes
17.4M /usr/share/vim
12.6M /usr/share/xml
8.9M /usr/share/icons
注:在裁减 debian 系统的时候,使用起来极其的方便