使用find命令查询系统盘符大文件

发布时间:2024年01月17日

使用find查询大文件及其大小,同时排除指定目录

某个ubuntu服务器,有多个/fwork目录,如果要查询根目录/下的大文件,那么就必须排出这些目录?

?df -h
Filesystem ? ? ?Size ?Used Avail Use% Mounted on
udev ? ? ? ? ? ? 63G ? 24G ? 39G ?39% /dev
tmpfs ? ? ? ? ? ?13G ? 21M ? 13G ? 1% /run
/dev/sdi2 ? ? ? ?93G ? 83G ?5.8G ?94% /
tmpfs ? ? ? ? ? ?63G ? ? 0 ? 63G ? 0% /dev/shm
tmpfs ? ? ? ? ? 5.0M ? ? 0 ?5.0M ? 0% /run/lock
tmpfs ? ? ? ? ? ?63G ? ? 0 ? 63G ? 0% /sys/fs/cgroup
/dev/sdi1 ? ? ? 511M ?3.6M ?508M ? 1% /boot/efi
/fwork14 ? ? ? ?2.0T ?1.7T ?217G ?89% /fwork14
/fwork1? ? ? ? ?2.0T ?1.9T ? 13G 100% /fwork1
/fwork2? ? ? ? 2.0T ?1.1T ?883G ?54% /fwork2
/fwork3? ? ? ? ?2.0T ?157G ?1.8T ? 9% /fwork3
/fwork4? ? ? ? ?2.0T ?1.8T ? 73G ?97% /fwork4
...

这个时候,我们可以使用下面的命令,排出我们不希望的目录,同时,输出希望查询出的文件及其大小

sudo find / -path "/fwork*" -prune  -o -type f -size +1000M  -exec ls -lh {} \;

对上上面的命令,可能会有点懵,没关系,我们只需要关注下面两个参数

?对于指定的目录,-prune会跳过改目录不进入它

-prune: 如果是一个目录,不要进入它,不再搜索它们的子目录或文件。

比如,如果想在当前目录下查询除了dir以外的其他目录,可以这样写

find .?-name dir?-prune -o -print

这里,-name dir?-prune是一个操作,它会让find忽略以dir目录,但是仍然会打印出它们的名字。为了避免这种情况,你需要用-o(逻辑或)把它和另一个操作分开,比如-print。这样,只有不符合-prune条件的文件才会被打印出来。

-o在两个文件之间不会应答前面的文件

-o:标识是or的意思,两边可以有两个判断条件,expression1 和?expression2 。如果expression1为真,那么expression2不会被评估。如果expression1为假,那么expression2会被评估。只要expression1或expression2中有一个为真,那么整个表达式就为真。

比如下面的命令只会显示bfile

find . -name afile -o -name bfile -print?

这是因为这实际上相当于

find . -name afile -o \( -name bfile -a -print \)

请记住,-a 的优先级高于 -o,当没有在测试之间指定运算符时,-a 是默认的。那么此时"-print"只会和“-name bfile”发生作用,而不会和“-name afile”发生作用

在没有明确指定优先级的情况下,-print动作默认只应用于前面最近的表达式

如果要同时显示两个文件,请使用

find . \( -name 1_add_users.sh -o -name 2_system_info.sh \) -print

我们上面用来查询大文件同时排除指定目录运用的就是这个原理

sudo find / -path "/fwork*" -prune  -o -type f -size +1000M  -exec ls -lh {} \;

?这个表达式的执行逻辑是,执行?-path "/fwork*" -prune? 表达式为真时不做任何操作,而执行?-type f -size +1000M ?时将查询出来的文件再执行?-exec ls -lh {} \;?

如果我们将两个表达式括起来,那么将会打印出我们希望排除的目录名

sudo find / \( -path "/fwork*" -prune  -o -type f -size +1000M \) -print

常见错误

错误:如果报错 find: paths must precede expression:xxx? ?路径必须在表达式之前:xxx

执行下面这个命令会报错find: paths must precede expression:xxx,

find . -name *.c -print

实际上这是因为*.c会被 shell 扩展,导致 find 实际上收到了这样的命令行: ?

?find . -name frcode.c locate.c word_io.c -print

如果要用通配符匹配,可以使用下面的方式

find . -name '*.c' -print
find . -name \*.c -print

文章来源:https://blog.csdn.net/qq_41566366/article/details/135645880
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。