日常维护中经常遇到磁盘空间告警的问题需要查看具体是那一个或多个文件占用的空间过大,再根据具体情况决定是否需要转移或删除。当然该问题可以通过find指令找出所有超出某大小的所有文件。除了find ,我们还可以使用ls、sort等常用命令快速便捷的确认具体是哪些文件占用光了磁盘。

一、ls查看占用最大的文件

1、S(大写)命令可以按文件从大到小排列(以byte为单位显示的)

 1# ls -lS
 2total 32772
 3-rw-r--r-- 1 root root 18877051 Dec  6 20:32 cms.sql
 4-rw-r--r-- 1 root root  7558809 Dec 25 22:21 blog91it.sql
 5-rw-r--r-- 1 root root  5053697 Dec  6 20:32 cms.tar.gz
 6-rw-r--r-- 1 root root  1977747 Dec 25 22:21 blog91it.tar.gz
 7-rw-r--r-- 1 root root    23276 Dec  1 00:33 a.py
 8-rw-r--r-- 1 root root    12049 Dec 18 23:09 spir.tar.gz
 9-rw-r--r-- 1 root root     7497 Nov  5 01:23 new.py
10-rw-r--r-- 1 root root     5326 Dec 21 19:25 segment.tar.gz
11drwxr-xr-x 4 root root     4096 Dec 19 00:38 py
12drwxr-xr-x 2 root root     4096 Nov 22 23:30 qiniu
13drwxr-xr-x 2 root root     4096 Dec 21 19:24 segment
14-rw-r--r-- 1 root root     1372 Jan  5 21:04 pid.py
15-rw-r--r-- 1 root root      499 Jan  7 21:51 cm.sh
16-rw-r--r-- 1 root root      285 Jan  5 21:29 vms.py
17-rw-r--r-- 1 root root      261 Jan  6 00:12 grep.py
18-rwxr-xr-x 1 root root      113 Jan  5 23:23 vmrss.sh

2、加上r参数可以反向排序(由小到大)

 1# ls -lSr
 2total 32772
 3-rwxr-xr-x 1 root root      113 Jan  5 23:23 vmrss.sh
 4-rw-r--r-- 1 root root      261 Jan  6 00:12 grep.py
 5-rw-r--r-- 1 root root      285 Jan  5 21:29 vms.py
 6-rw-r--r-- 1 root root      499 Jan  7 21:51 cm.sh
 7-rw-r--r-- 1 root root     1372 Jan  5 21:04 pid.py
 8drwxr-xr-x 2 root root     4096 Dec 21 19:24 segment
 9drwxr-xr-x 2 root root     4096 Nov 22 23:30 qiniu
10drwxr-xr-x 4 root root     4096 Dec 19 00:38 py
11-rw-r--r-- 1 root root     5326 Dec 21 19:25 segment.tar.gz
12-rw-r--r-- 1 root root     7497 Nov  5 01:23 new.py
13-rw-r--r-- 1 root root    12049 Dec 18 23:09 spir.tar.gz
14-rw-r--r-- 1 root root    23276 Dec  1 00:33 a.py
15-rw-r--r-- 1 root root  1977747 Dec 25 22:21 blog91it.tar.gz
16-rw-r--r-- 1 root root  5053697 Dec  6 20:32 cms.tar.gz
17-rw-r--r-- 1 root root  7558809 Dec 25 22:21 blog91it.sql
18-rw-r--r-- 1 root root 18877051 Dec  6 20:32 cms.sql

3、加上h参数以更友好的方式显示

 1# ls -lhS
 2total 33M
 3-rw-r--r-- 1 root root  19M Dec  6 20:32 cms.sql
 4-rw-r--r-- 1 root root 7.3M Dec 25 22:21 blog91it.sql
 5-rw-r--r-- 1 root root 4.9M Dec  6 20:32 cms.tar.gz
 6-rw-r--r-- 1 root root 1.9M Dec 25 22:21 blog91it.tar.gz
 7-rw-r--r-- 1 root root  23K Dec  1 00:33 a.py
 8-rw-r--r-- 1 root root  12K Dec 18 23:09 spir.tar.gz
 9-rw-r--r-- 1 root root 7.4K Nov  5 01:23 new.py
10-rw-r--r-- 1 root root 5.3K Dec 21 19:25 segment.tar.gz
11drwxr-xr-x 4 root root 4.0K Dec 19 00:38 py
12drwxr-xr-x 2 root root 4.0K Nov 22 23:30 qiniu
13drwxr-xr-x 2 root root 4.0K Dec 21 19:24 segment
14-rw-r--r-- 1 root root 1.4K Jan  5 21:04 pid.py
15-rw-r--r-- 1 root root  499 Jan  7 21:51 cm.sh
16-rw-r--r-- 1 root root  285 Jan  5 21:29 vms.py
17-rw-r--r-- 1 root root  261 Jan  6 00:12 grep.py
18-rwxr-xr-x 1 root root  113 Jan  5 23:23 vmrss.sh

不过上面的排序,如果仔细观察的话会发现一个问题,就是所有目录显示的大小都是4K (linux默认pagesize的大小 )。如果我们想将目录也算上就要使用du配合sort进行排序了。

二、du和sort排序

1、sort的-h参数

 1#当du不加-sh参数时py目录未当做一个整体进行排序,而是将其下的目录也进行了排序
 2# du * |sort -h
 34       cm.sh
 44       grep.py
 54       pid.py
 64       vmrss.sh
 74       vms.py
 88       new.py
 98       segment.tar.gz
1012      spir.tar.gz
1124      a.py
1228      segment
1360      py/moudle
1468      py/python/pycurl
1584      py/python
16184     py
171932    blog91it.tar.gz
184936    cms.tar.gz
197384    blog91it.sql
2018436   cms.sql
2143412   qiniu
22#加上参数后,可以看到目录都被当做一个整体处理了
23# du * -sh|sort -h
244.0K    cm.sh
254.0K    grep.py
264.0K    pid.py
274.0K    vmrss.sh
284.0K    vms.py
298.0K    new.py
308.0K    segment.tar.gz
3112K     spir.tar.gz
3224K     a.py
3328K     segment
34184K    py
351.9M    blog91it.tar.gz
364.9M    cms.tar.gz
377.3M    blog91it.sql
3819M     cms.sql
3943M     qiniu

2、sort -g参数

 1# du * |sort -g  (效果和du *|sort -h一样)
 24       cm.sh
 34       grep.py
 44       pid.py
 54       vmrss.sh
 64       vms.py
 78       new.py
 88       segment.tar.gz
 912      spir.tar.gz
1024      a.py
1128      segment
1260      py/moudle
1368      py/python/pycurl
1484      py/python
15184     py
161932    blog91it.tar.gz
174936    cms.tar.gz
187384    blog91it.sql
1918436   cms.sql
2043412   qiniu
21这里du使用-sh参数后,结果确不按大小进行排序了
22# du * -sh|sort -g
231.9M    blog91it.tar.gz
244.0K    cm.sh
254.0K    grep.py
264.0K    pid.py
274.0K    vmrss.sh
284.0K    vms.py
294.9M    cms.tar.gz
307.3M    blog91it.sql
318.0K    new.py
328.0K    segment.tar.gz
3312K     spir.tar.gz
3419M     cms.sql
3524K     a.py
3628K     segment
3743M     qiniu
38184K    py

3、sort -h与-g参数的区别

-h参数是GNU coreutils >= 7.5以后新增的参数,-h会以K、M、G这种大小的顺序进行人类便于识别的顺序进行排序。不过在一些老的linux发行版里,sort里可能没有这个参数。这个时候就需要使用-g参数。而du * -sh|sort -h与du * -s|sort -g 的排序效果是相同的。两个参数的具体区别如下:

1-h, --human-numeric-sort    compare human readable numbers (e.g., 2K 1G)
2-g, --general-numeric-sort  compare according to general numerical value