Linux入门真经-035使用find去查找文件

常见的linux文件查找工具有locate和find。

 

locate的优点在于:它是基于索引库创建,周期性更新。因此速度相当快,查找时资源消耗极少。缺点是:由于不是实时查找,所以一些在更新周期之前新增的文件没法找到。我们可以随时对locate的数据库进行手动更新,不过更新时会消耗很多的计算资源,甚至会造成暂时的卡顿。

 

find是一个实时查找工具,他的优点与locate互补:实时性好、精确度高,但是查找速度慢且较消耗资源。

用法:

find [OPTIONS]  [查找起始路径]  [查找条件]  [处理动作]

 

查找起始路径:

指定具体搜索目标起始路径;默认为当前目录;

 

查找条件:

指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等等标准进行;默认为找出指定路径下的所有文件;

 

处理动作:对符合查找条件的文件做出的操作,例如删除等操作;默认为输出至标准输出;

 

1、查找条件

 

表达式:选项和测试

测试:结果通常为布尔型("true","false")

根据文件名查找:

     -name  "pattern"

    ​ -I name  "pattern"

支持glob风格的通配符;

-regex pattern:基于正则表达式模式查找文件,匹配是整个路径,而非其名;

根据文件从属关系查找:

    ​-user USERNAME:查找属主指定用户的所有文件;

    ​-group GRPNAME:查找属组指定组的所有文件;                               

    ​-uid UID:查找属主指定的UID的所有文件;

    ​-gid GID:查找属组指定的GID的所有文件;

    ​-nouser:查找没有属主的文件;

     -nogroup:查找没有属组的文件;

 

根据文件的类型查找:

     -type TYPE:TYPE包括

    ​    ​f:普通文件

        d:目录文件

        l:符号链接文件

        b:块设备 文件

        c:字符设备文件

        p:管道文件

        s:套接字文件

组合测试:

        与:-a, 默认组合逻辑;

        或:-o

        非:-not, !

                                                                

根据文件的大小查找(#表示数字):

    ​-size [+|-]#UNIT

     常用单位:k, M, G                  

     #UNIT:(#-1, #]

     -#UNIT:[0,#-1]

     +#UNIT:(#, oo)

根据时间戳查找:

       以“天”为单位(#表示数字):

      -atime  [+|-]#

       #:[#, #-1)

       -#:(#, 0]

       +#:(oo, #-1]

       -mtime

       -ctime

                                                                

       以“分钟”为单位:

       -amin

       -mmin

       -cmin

       根据权限查找:

       -perm  [/|-]mode

        mode:精确权限匹配;

        /mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足;

        9位权限之间存在“或”关系;

        -mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;

        9位权限之间存在“与”关系;

 

2、处理动作

 

-print:输出至标准输出;默认的动作;

-ls:类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息;

-delete:删除查找到的文件;

-fls /PATH/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中;

-ok COMMAND {} \;   :对查找到的每个文件执行由COMMAND表示的命令;每次操作都由用户进行确认;

-exec COMMAND {} \;  :对查找到的每个文件执行由COMMAND表示的命令;

                                    

注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;

但是有些命令不能接受过长的参数,此时命令执行会失败;另一种方式可规避此问题:

​find命令 | xargs COMMAND

 

3、练习

 

我先把公式贴在这:

find [OPTIONS]  [查找起始路径]  [查找条件]  [处理动作]

 

1、  查找/var目录下属主为root,且属组为mail的所有文件或目录;

 

[root@localhost ~]# find /var -user root -a -group mail -ls

 19210   0 drwxrwxr-x   2 root     mail           80 Aug 25 10:48 /var/spool/mail

[root@localhost ~]#

 

2、查找/etc目录下最近一周内其内容修改过,且属主是root用户的文件或目录;

 

[root@localhost ~]# find /etc -mtime -7 -a  -user root

/etc

/etc/fstab

/etc/resolv.conf

/etc/group-

/etc/gshadow-

/etc/passwd-

/etc/group

/etc/shadow-

/etc/gshadow

/etc/passwd

/etc/shadow

/etc/tuned/active_profile

/etc/tuned/profile_mode

/etc/sudoers

 

3、  查找/etc目录下大于1M且类型为普通文件的所有文件;

 

[root@localhost ~]# find /etc -size +1M -type f -exec ls -lh {} \;

-r--r--r--. 1 root root 7.5M Jul 24 18:51/etc/udev/hwdb.bin

-rw-------. 1 root root 3.6M Apr 11 14:41/etc/selinux/targeted/active/policy.kern

-rw-r--r--. 1 root root 1.3M Apr 11 15:29/etc/selinux/targeted/contexts/files/file_contexts.bin

-rw-r--r--.1 root root 3.6M Apr 11 14:41 /etc/selinux/targeted/policy/policy.31

 

4、查找/etc目录下所有用户都没有任何权限的文件;

 

[root@localhost ~]# find /etc -not -perm /777 -type f -ls

17054607   4 ----------   1 root     root          448 Aug 25 09:32 /etc/gshadow-

17054828   4 ----------   1 root     root          993 Aug 25 10:37 /etc/shadow-

16777478   4 ----------   1 root     root          459 Aug 25 10:48 /etc/gshadow

16777474    4 ----------   1 root    root         1118 Aug 25 10:53/etc/shadow

 

5、查找所有以.py结尾的文件

 

[root@localhost ~]# find / -name *.py

/usr/lib/python2.7/site-packages/decorator.py

/usr/lib/python2.7/site-packages/slip/__init__.py

/usr/lib/python2.7/site-packages/slip/_wrappers/__init__.py

…省略输出…

 

6、  我们在上一节创建了一个/tmp/fstab文件并且设置了硬链接,把他的硬链接全部找出来并删除

 

[root@localhost ~]# find / -inum 16777282-ok rm {} \;

< rm ... /tmp/fstab > ? yes

< rm ... /tmp/fstab.ln > ?u^Hyes   #手抖没删掉

[root@localhost ~]# find / -inum 16777282

/tmp/fstab.ln

[root@localhost ~]# find / -inum 16777282-ok rm {} \;

< rm ... /tmp/fstab.ln > ? yes

[root@localhost ~]# find / -inum 16777282-ok rm {} \;

[root@localhost ~]#

 

关注本公众号获取每日更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值