天天看点

linux小记:找到最占磁盘的文件(夹)查看占用情况最大文件夹top10最大独立文件夹top10附:find命令

  • 查看占用情况
  • 最大文件夹top10
    • 结论
  • 最大独立文件夹top10
    • 结论
    • 最大文件top10
    • 结论
  • 附:find命令
    • 格式
    • 按照文件名查找
    • 按照正则表达式匹配文件路径
    • 按照文件类型查找
    • 按照目录深度查找
    • 按照文件时间戳进行搜索
    • 按照文件大小进行搜索
    • 查找条件或与非
    • 参数传递
    • 其他

最近突然发现我的家目录已经用了70%+了,所以想知道到底是什么东西占了我这么多地方。

主要用到了以下几个命令:

du

disk usage查看磁盘使用情况、

find

查找文件、

sort

排序命令

head

显示top N的命令。

查看占用情况

查看自己的home磁盘使用率:

pichu@Archer ~ $ df -h
文件系统        容量  已用  可用 已用% 挂载点
udev            G       G    % /dev
tmpfs           G  M  G    % /run
/dev/sda7        G   G   G   % /
tmpfs           G  M  G    % /dev/shm
tmpfs           M  K  M    % /run/lock
tmpfs           G       G    % /sys/fs/cgroup
/dev/sda1       M   M  M   % /boot/efi
/dev/sdb3        G   G   G   % /home
tmpfs           G   K  G    % /run/user/1000
           

可看到100G的/home分区已经用了70%了,还剩29G。

-h

:human-readable,以人类可读的方式显示,即显示为K、M、G等单位。一般

-h

都是显示help,但是和大小相关的一般都是以人类可读的方式输出大小。

home下也就我一个人在用,所以65个G全是我占用的。

pichu@Archer ~ $ du -hd  /home
G     /home/pichu
G     /home
           

-h

:human-readable,同上。

-d, --max-depth=N

:目录的层数。

所以这里的意思是,只查看/home下一层目录深度,并以人类可读的方式输出大小。

下面才是关键:找出那些最占空间的文件。

最大文件夹top10

最大的文件夹top10:

pichu@Archer ~ $ du -h ~ | sort -hr | head - 
G     /home/pichu
G     /home/pichu/VirtualBox VMs/Win7
G     /home/pichu/VirtualBox VMs
G    /home/pichu/.IntelliJIdea2017
G    /home/pichu/.IntelliJIdea2017/system
G    /home/pichu/.IntelliJIdea2017/system/index
G    /home/pichu/Codes/Java
G    /home/pichu/Codes
G    /home/pichu/.m2/repository
G    /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

[email protected] ~ $ du -h ~ | sort -r | head - 
M    /home/pichu/.m2/repository/org/apache/hadoop/hadoop-yarn-server-resourcemanager/
M    /home/pichu/.m2/repository/org/apache/hadoop/hadoop-yarn-server-resourcemanager
M    /home/pichu/.ivy2/cache/toolbox/text-tools/zips
M    /home/pichu/.ivy2/cache/external/findbugs/zips
M     /home/pichu/.atom/packages/markdown-pdf/node_modules
M     /home/pichu/.atom/packages/markdown-pdf
K    /home/pichu/.m2/repository/org/apache/commons/commons-math/
           

可看到排名前几的竟然才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 -
G     /home/pichu/VirtualBox VMs/Win7
G    /home/pichu/.IntelliJIdea2017./system/index/trigram.index
G    /home/pichu/.IntelliJIdea2017./system/Maven/Indices/Index5/data/context
G    /home/pichu/Public/windows
G    /home/pichu/.local/share/Trash/files
G    /home/pichu/.cache/netease-cloud-music/CachedSongs
M    /home/pichu/Pictures
M    /home/pichu/.IntelliJIdea2017./system/caches
M    /home/pichu/Downloads
M    /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:

[email protected] ~ $ find ~ -type f -exec du -h {} + | sort -rh | head -
G     /home/pichu/VirtualBox VMs/Win7/Win7_2rd.vdi
G    /home/pichu/.IntelliJIdea2017/system/index/trigram.index/Trigram.Index.storage.values
G    /home/pichu/.IntelliJIdea2017/system/Maven/Indices/Index5/data0/context/_77.cfs
G    /home/pichu/Public/windows/SW_DVD5_Office_Professional_Plus_2016_64Bit_ChnSimp_MLF_X20-ISO
M    /home/pichu/.local/share/Trash/files/java_error_in_IDEA.hprof
M    /home/pichu/Public/windows/Office_Professional_PlusVL_2010_x64_Activated.iso
M    /home/pichu/.IntelliJIdea2017/system/caches/content.dat.storageData
M    /home/pichu/tmp/CLion-.tar.gz
M    /home/pichu/Utils/druid/druid-/log/log-coordinator
M    /home/pichu/Utils/druid/druid--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/system/port.lock
./.IntelliJIdea2017/config/port.lock
           

继续阅读