linux小记:找到最占磁盘的文件(夹)

最近突然发现我的家目录已经用了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竟然榜上无名。这是因为没了-hsort单纯按照数字大小排序。所以dusort需要同时用-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: KB
  • M: MB
  • G: 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
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Protobuf是一种高效的序列化协议,可以用于数据交换和数据存储。它的主要优势是大小小,速度快,可扩展性强。下面是使用Protobuf的一些小记: 1. 定义消息格式 首先,需要定义消息格式,以便Protobuf可以将数据序列化和反序列化。消息格式定义在.proto文件中,使用protobuf语言编写。例如,下面是一个简单的消息格式定义: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 这个消息格式定义了一个名为Person的消息,包含两个字段:name和age。 2. 生成代码 一旦消息格式定义好,就可以使用Protobuf编译器生成代码。编译器将根据消息格式定义生成相应的代码,包括消息类、序列化和反序列化方法等。可以使用以下命令生成代码: ``` protoc --java_out=. message.proto ``` 这将生成一个名为message.pb.java的Java类,该类包含Person消息的定义以及相关方法。 3. 序列化和反序列化 一旦生成了代码,就可以使用Protobuf序列化和反序列化数据。例如,下面是一个示例代码,将一个Person对象序列化为字节数组,并将其反序列化为另一个Person对象: ``` Person person = Person.newBuilder() .setName("Alice") .setAge(25) .build(); byte[] bytes = person.toByteArray(); Person deserializedPerson = Person.parseFrom(bytes); ``` 这个示例代码创建了一个Person对象,将其序列化为字节数组,然后将其反序列化为另一个Person对象。在这个过程中,Protobuf使用生成的代码执行序列化和反序列化操作。 以上是使用Protobuf的一些基本步骤和注意事项,希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值