最近突然发现我的家目录已经用了70%+了,所以想知道到底是什么东西占了我这么多地方。
主要用到了以下几个命令:du
disk usage查看磁盘使用情况、find
查找文件、sort
排序命令
、head
显示top N的命令。
查看占用情况
查看自己的home磁盘使用率:
pichu@Archer ~ $ df -h
文件系统 容量 已用 可用 已用% 挂载点
udev 7.8G 0 7.8G 0% /dev
tmpfs 1.6G 9.4M 1.6G 1% /run
/dev/sda7 28G 15G 12G 56% /
tmpfs 7.8G 360M 7.4G 5% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/sda1 496M 60M 437M 12% /boot/efi
/dev/sdb3 99G 66G 29G 70% /home
tmpfs 1.6G 12K 1.6G 1% /run/user/1000
可看到100G的/home分区已经用了70%了,还剩29G。
-h
:human-readable,以人类可读的方式显示,即显示为K、M、G等单位。一般-h
都是显示help,但是和大小相关的一般都是以人类可读的方式输出大小。
home下也就我一个人在用,所以65个G全是我占用的。
pichu@Archer ~ $ du -hd 1 /home
65G /home/pichu
65G /home
-h
:human-readable,同上。
-d, --max-depth=N
:目录的层数。
所以这里的意思是,只查看/home下一层目录深度,并以人类可读的方式输出大小。
下面才是关键:找出那些最占空间的文件。
最大文件夹top10
最大的文件夹top10:
pichu@Archer ~ $ du -h ~ | sort -hr | head -10
65G /home/pichu
34G /home/pichu/VirtualBox VMs/Win7
34G /home/pichu/VirtualBox VMs
8.3G /home/pichu/.IntelliJIdea2017.3
8.2G /home/pichu/.IntelliJIdea2017.3/system
4.9G /home/pichu/.IntelliJIdea2017.3/system/index
3.8G /home/pichu/Codes/Java
3.8G /home/pichu/Codes
3.7G /home/pichu/.m2/repository
3.7G /home/pichu/.m2
sort
:
-r, --reverse
:逆序排列。本来对数字排序应该是1在前,2在后,现在反过来了。
-h, --human-numeric-sort
:既然显示文件大小的命令,-h
代表人类可读的方式输出文件大小,那么sort命令自然是以人类可读的数字去排序。
head
:
-n, --lines=[-]NUM
:输出多少行。-n 10
等价于-10
。
所以命令的意思就是显示home下所有文件的大小,并逆序排列,最后显示top10。
如果sort
不加-h
:
pichu@Archer ~ $ du -h ~ | sort -r | head -10
9.9M /home/pichu/.m2/repository/org/apache/hadoop/hadoop-yarn-server-resourcemanager/2.7.1
9.9M /home/pichu/.m2/repository/org/apache/hadoop/hadoop-yarn-server-resourcemanager
9.9M /home/pichu/.ivy2/cache/toolbox/text-tools/zips
9.9M /home/pichu/.ivy2/cache/external/findbugs/zips
99M /home/pichu/.atom/packages/markdown-pdf/node_modules
99M /home/pichu/.atom/packages/markdown-pdf
996K /home/pichu/.m2/repository/org/apache/commons/commons-math/2.2
可看到排名前几的竟然才9.9M,而65G的/home/pichu竟然榜上无名。这是因为没了-h
,sort
单纯按照数字大小排序。所以du
和sort
需要同时用-h
(或者同时不用)。
结论
根据输出结果,可看到最大的文件夹是65G的/home/pichu,其次是放置了windows7虚拟机的文件夹。紧接着,编程IDE intellij idea占用空间较大,看目录得知是idea构建的索引的大小。所以说,之所以用idea编程这么方便,是因为它背后默默地做了相当多的工作。
然后我的代码目录占了3.8G。想想应该主要是有很多工程用的ant+ivy,这些工具必须将依赖resolve到代码工程里,这些依赖应该是占这么大空间的主要原因。(如果单靠代码占了3.8G,那是有点儿够疯狂了)
最后,占top10的是本地maven仓库3.7G。这点比较符合情理。
但是,结果并非尽如人意。首先,第一条信息是无效的,因为家目录包含了其他所有的目录,它肯定是最大的。而且/home/pichu/.IntelliJIdea2017.3之所以能排到第四,纯粹因为其子目录system有8.2G,跟它本身大小并没有什么关系。同理,/home/pichu/Codes之所以能排进前十,也全靠它的子目录/home/pichu/Codes/Java的大小。所以这种排序方式还是产生了一些无意义的排名。
因此,按照文件夹大小排序有一定的效果,但还需结合其他方式。
最大独立文件夹top10
如果能够看到某文件夹自己本身的大小,而不包含其子文件夹的大小,就不会出现上述不足之处了。
最大文件夹top10(不包含子文件夹的大小):
pichu@Archer ~ $ du -Sh ~ | sort -hr | head -10
34G /home/pichu/VirtualBox VMs/Win7
2.7G /home/pichu/.IntelliJIdea2017.3/system/index/trigram.index
2.6G /home/pichu/.IntelliJIdea2017.3/system/Maven/Indices/Index5/data0/context
2.0G /home/pichu/Public/windows
1.1G /home/pichu/.local/share/Trash/files
1.0G /home/pichu/.cache/netease-cloud-music/CachedSongs
865M /home/pichu/Pictures
579M /home/pichu/.IntelliJIdea2017.3/system/caches
579M /home/pichu/Downloads
572M /home/pichu/Codes/Java/uni-server/lib
-S, --separate-dirs
:仅显示该目录除掉子目录之后的大小。
结论
这么排序的结论就比较有说服力了。排第一的是windows7所在的文件夹。其后是idea的一些配置文件夹的大小。然后是1.1G的trash文件(这个就是可以删除的)。接着是网易云音乐的cache文件、idea的cache、下载的一些内容、某工程代码的lib目录(就是之前说的ant+ivy必须把代码的依赖resolve本到工程下,所以才导致Code目录有3.8G)。
因此我们可以删掉trash文件,删除cache等,清理出一部分磁盘空间。
当然这么排序也有一些不足的地方,比如只能看到idea的配置文件夹下的 system/index/trigram.index 和 system/Maven/Indices/Index5/data0/context 比较占空间,但是整个.IntelliJIdea2017.3究竟占多大空间就不清楚了,这个信息可以在上文的排序方式中看到。因此这两种排序方式都有其存在的价值。
最大文件top10
除了看文件夹的大小,我们当然也很想找出最占空间的那些单文件。
最大文件top10:
pichu@Archer ~ $ find ~ -type f -exec du -h {} + | sort -rh | head -10
34G /home/pichu/VirtualBox VMs/Win7/Win7_2rd.vdi
2.7G /home/pichu/.IntelliJIdea2017.3/system/index/trigram.index/Trigram.Index.storage.values
2.6G /home/pichu/.IntelliJIdea2017.3/system/Maven/Indices/Index5/data0/context/_77.cfs
1.1G /home/pichu/Public/windows/SW_DVD5_Office_Professional_Plus_2016_64Bit_ChnSimp_MLF_X20-42426.ISO
929M /home/pichu/.local/share/Trash/files/java_error_in_IDEA.hprof
921M /home/pichu/Public/windows/Office_Professional_PlusVL_2010_x64_Activated.iso
338M /home/pichu/.IntelliJIdea2017.3/system/caches/content.dat.storageData
334M /home/pichu/tmp/CLion-2018.1.6.tar.gz
279M /home/pichu/Utils/druid/druid-0.11.0/log/log-coordinator
220M /home/pichu/Utils/druid/druid-0.11.0-bin.tar.gz
find
:
-type
:指定寻找文件类型的文件。f
代表普通文件,d
代表文件夹等。
-exec
:传递参数,将find
到的文件传递给后面的du
命令。
所以find
指令加上du
,在这里所做的事情就是找到家目录下所有的普通文件(不包括目录等),并以人类可读的方式计算出所有文件的大小。
然后再使用sort
排序,head
输出前十。
结论
第一大文件就是那个windows7虚拟机的虚拟硬盘文件。然后是idea对代码的索引文件、idea对本地maven依赖的索引文件、一个windows的office2016安装文件、trash文件、office2010安装文件、下载的一些安装包等。
然后就可以删掉那些office安装文件、trash文件、下载的文件包,给硬盘腾空间了。
附:find命令
格式
find [path] [expression]
按照文件名查找
在/home目录下查找以.txt结尾的文件名:find /home -name "*.txt"
-name
:后加shell模式的正则表达式,作为文件名称的匹配模式。
在/home目录下查找以.txt(忽略大小写)结尾的文件名:find /home -iname "*.txt"
-iname
:同上,但忽略大小写。
按照正则表达式匹配文件路径
注意是匹配文件路径! 这是对整个路径的匹配,不是搜索文件。例如,要匹配名为./fubar3
的文件,可以使用正则表达式 .*bar.
或者 .*b.*3
,但是不能用b.*r3
(因为路径不是以b
开头的)。
find . -regex ".*\(\.txt|\.pdf\)$"
同上,但忽略大小写:find . -iregex ".*\(\.txt|\.pdf\)$"
按照文件类型查找
f
普通文件l
符号连接d
目录
一般用到的就这三种。
比如上文中,查找家目录下的所有普通文件:find ~ -type f
按照目录深度查找
-maxdepth levels
:进入命令行参数指定的目录下层目录时,最深不超过levels(一个非负整数) 层。-maxdepth 0
意味着只在命令行参数指定的目录中执行测试和动作。
-mindepth levels
:不在levels(一个非负整数)层之内执行任何测试和动作。-mindepth 1
意 味着处理所有的文件,除了命令行参数指定的目录中的文件。
向下最大深度限制为3:find . -maxdepth 3 -type f
搜索出深度距离当前目录至少2个子目录的所有文件:find . -mindepth 2 -type f
按照文件时间戳进行搜索
UNIX/Linux文件系统每个文件都有三种时间戳:
- 访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
- 修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
- 变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
数字前正负号的意义:
- +n
是比 n 大,
- -n
是比 n 小,
- n
正好是 n 。
寻找/dir下的七天前的所有文件夹:find /dir -type d -mtime +7
找出比hello.txt修改时间更新(即,更晚修改)的所有文件:find . -type f -newer hello.txt
-newer file
:对文件的最近一次修改比 file 修改时间要晚。
按照文件大小进行搜索
k
: KBM
: MBG
: GB
一般用到的就这三种。
搜索Pictures下>10MB的文件:find Pictures -type f -size +10M
同时间,+n
/-n
/n
分别代表>n
/<n
/正好为n
。
查找条件或与非
expr1 逻辑词 expr2
,其中expr代表参数 值
,比如-name "*.txt"
。
如果find多个expr之间不加逻辑词,默认是使用-and
。比如find . -mtime +7 -type d
等同于find . -mtime +7 -and -type d
:寻找当前目录下修改时间在7天前的文件夹。
当前目录及子目录下查找所有以.txt和.pdf结尾的文件:find . -name "*.txt" -or -name "*.pdf"
expr1 -or expr2
expr1 -and expr2
-not expr
逻辑非也可用!
代替,如find /home ! -name "*.txt"
等价于find /home -not -name "*.txt"
优先级(先列出的优先级更高):
- ( expr )
- ! expr
或者-not expr
- expr1 expr2
或者expr1 -a expr2
或者expr1 -and expr2
- expr1 -o expr2
或者expr1 -or expr2
注意,当用括号强制优先级时:find . \( -name "*.txt" -or -name "*.pdf" \)
,记得转义,且括号要和命令之间留有空格。
示例:
找出当前文件夹下七天前的文件或目录:find . -type d -mtime +7 -or -type f -mtime +7
,默认添加了and:-type d -and -mtime +7 -or -type f -and -mtime +7
。由于and优先级更高,所以相当于检索条件为(-type d -mtime +7) -or (-type f -mtime +7)
。这么写有些啰嗦,可以直接写为find . \( -type d -or -type f \) -mtime +7
。
参数传递
删除/dir下的七天前的所有文件夹:find /dir -type d -mtime +7 | xargs rm -rf
使用xargs将find到的结果传递给rm,删除文件。
同理,还有-exec
参数,如find /dir -type d -mtime +7 -exec rm -rf {} \+
或find /dir -type d -mtime +7 -exec rm -rf {} \;
可以起到和xargs相同的效果。
关于;
和+
的区别:可查看 https://stackoverflow.com/a/6085237/7676237 。为了防止被shell直接解释,通常给他们加上转义符号,以防万一。
其他
寻找大小为0的空文件:find ~ -type f -empty
-empty
文件是空的普通文件或者空目录。
但是这些文件也不要都直接删掉,因为很多这种文件都是起到一个锁的作用,作为一个标识,代表某资源已被占用,从而保证同步性。比如:
./.IntelliJIdea2017.3/system/port.lock
./.IntelliJIdea2017.3/config/port.lock