某个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: 如果是一个目录,不要进入它,不再搜索它们的子目录或文件。
比如,如果想在当前目录下查询除了dir以外的其他目录,可以这样写
find .?-name dir?-prune -o -print
这里,-name dir?-prune是一个操作,它会让find忽略以dir目录,但是仍然会打印出它们的名字。为了避免这种情况,你需要用-o(逻辑或)把它和另一个操作分开,比如-print。这样,只有不符合-prune条件的文件才会被打印出来。
-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,
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