路漫漫其修远兮
吾将上下而求索

linux文件查找:find 命令

        find查找命令在目录结构中搜索文件,并执行指定的操作。Linux下find命令提供了相当多的查找条件,功能很强大。

        由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。

        即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权限。 

        在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。

1.命令格式:  

        find [-H] [-L] [-P] [path…] [expression]

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

2.命令功能:

       search for files in a directory hierarchy,用于在文件树种查找文件,并作出相应的处理 

        工作特性:

              1. 查找速度略慢

              2. 精确查找

              3. 实时查找

3.命令参数:因为选项太多,每个选项会举一个例子

        查找起始路径:指定具体搜索目标起始路径:默认当前目录,即空格表示当前文件

        查找条件:根据文件名,大小,类型,从属关系,权限等,

                1. 根据文件名查找:

                   a. -name “pattern”

                   b. -samefile name  相同inode号的文件,硬链接

[root@bogon ~]#ls
[root@bogon ~]# touch a
[root@bogon ~]#ln a b
[root@bogon ~]#ll
total 0
-rw-r--r-- 2 root root 0 Mar 18 13:47 a
-rw-r--r-- 2 root root 0 Mar 18 13:47 b
[root@bogon ~]#find / -samefile a
/root/a
/root/b

                   c. -iname “pattern”不分大小写,Like -name, but the match is case  insensitive.

[root@bogon ~]#touch abcdef
[root@bogon ~]#touch /etc/ABCdeF
[root@bogon ~]#find / -iname "abcdef"
/root/abcdef
/etc/ABCdeF

                   d. 支持glob风格的通配符:*,?,[],[^],只有name这个选项支持glob通配符

[root@bogon ~]#find / -name "abc*f"
/root/abcdef

                  2. 根据文件从属关系查找,

                   a. -user USERNAME 查找属主为指定用户的所有文件

[root@bogon ~]#find / -user zhao
/var/spool/mail/zhao
/home/zhao
[root@bogon ~]#ll /home/zhao -d
drwx------. 5 zhao zhao 4096 Sep  3  2016 /home/zhao

                   b. -group GRPNAME 查找属组为指定组的所有文件

                   c. -uid UID:查找属主指定UID的所有文件

[root@bogon ~]#id zhao
uid=500(zhao) gid=500(zhao) groups=500(zhao)
[root@bogon ~]#find / -uid 500
/var/spool/mail/zhao
/home/zhao

                   d. -nouser:查找没有属主指定用户的所有文件,比较危险,

[root@bogon ~]#userdel zhao
[root@bogon ~]#find / -nouser
/var/spool/mail/zhao
/home/zhao
[root@bogon ~]#ll -d /home/zhao
drwx------. 5 500 500 4096 Sep  3  2016 /home/zhao

                   e. -nogroup:查找没有属组指定组的所有文件

                  3. 根据文件类型查找:-type TYPE     TYPE可能的值:

                   i. f:普通文件

                   ii. d:目录文件

                   iii. l:链接文件

                   iv. b:块设备文件

                   v. c:字符设备

                   vi. p:管道文件

                   vii. s:套接字文件

[root@bogon ~]#find / -type l | less
/sbin/vgremove
[root@bogon ~]#ll /sbin/vgremove
lrwxrwxrwx. 1 root root 3 Jul 21  2016 /sbin/vgremove -> lvm

                  4. 根据文件大小查找:

                   a. -size [+|-]#UNIT     -size -#UNIT 小于这个容量,-size +#UNIT 大于这个容量的

                   i. 常用单位,UNIT:c,k,M,G    分别是小写c,小写k,大写M,大写G

                   ii. #UNIT:(#-1,#],精确查找,

                   iii. -#UNIT:[0,#-1],小于指定容量

                   iv. +#UNIT:(#,OO],大于指定容量

                   v. # find /tmp -size +1k -ls  查找大于1k的数据在/tmp下

[root@bogon ~]#find / -size 144c 
/var/log/messages
[root@bogon ~]#ll /etc/pam.d/ppp 
-rw-r--r--. 1 root root 144 Mar 16  2015 /etc/pam.d/ppp

[root@bogon ~]#find /tmp -size +1M
/tmp/VMwareTools-10.0.5-3228253.tar.gz
[root@bogon ~]#ll -h /tmp/VMwareTools-10.0.5-3228253.tar.gz
-r--r--r--. 1 root root 69M Sep  3  2016 /tmp/VMwareTools-10.0.5-3228253.tar.gz

 

                 5. 根据时间戳查找:

                   a. 以天为单位:

                   i. 按照访问时间Access:-atime [+|-]#    大于#天:+#,小于#天:-#

                   1. # find /etc -atime +7 -ls 七天前(大于7天)访问的文件

                   ii. 按照更改时间Modify:-mtime

                   iii. 按照创建时间Change:-ctime

                   b. 以分钟为单位:

                   i. -amin

                   ii. -mmin

                   iii. -cmin

                  6. 根据权限查找:-perm mode        permission权限 

                   a. mode:   精确查找,即所有位都必须符号要求后才能匹配成功

                   i. # find ./ -perm 644 -ls

                   b. /mode: 任何一类用户(u,g,o)的任何一位(r,w,x)符合条件,既满足,权限9个位中只要有一个对应位和查找条件的位相同,就符合

                   i. # find ./ -perm /444 -ls   444对应二进制 100 100 100  也就是说匹配的文件只要任何一类有读权限就可以匹配到,0表示不关心

                   c. 作用:将其他用户有写权限的文件全部改掉

                   i. # find ./ -perm /002 -exec mv {} {}.danger \;   原来的文件明个后面添加,danger,前两位为0表明不关心,什么权限都可以    

                   d. -mode:find -perm -mode , 表示mode中转换成二进制的1在文件权限位里面必须匹配,比如mode=644那么转换成二进制为110 100 100,而被查找的文件的权限位也可以被转换成一个二进制数,两者在位上为1的部分必须完全匹配,而0则不管。例如被查找的文件的权限为转换成二进制数是111 111 111那么这个比如被匹配,而假如是100 100 100那么则不会匹配。所以这个'-'的作用归结起来就是匹配比mode权限更充足的文件

                   i. # find ./ -perm  -222   每类用户都要有写权限才满足,其他位不关心,有或没有都可以

[root@bogon ~]#find -perm 600
./anaconda-ks.cfg
[root@bogon ~]#ll
total 960
-rw-------. 1 root root   1478 Jul 21  2016 anaconda-ks.cfg

[root@bogon /abc]#ll
total 0
-rw-r--r-x 1 root root 0 Mar 18 20:13 a
-rw-r--r-- 1 root root 0 Mar 18 20:13 b
-rw-r--r-- 1 root root 0 Mar 18 20:13 c
-rw-r--r-- 1 root root 0 Mar 18 20:13 d
-rw-r--r-- 1 root root 0 Mar 18 20:13 e
-rw-r--r-- 1 root root 0 Mar 18 20:13 f
[root@bogon /abc]#find ./ -perm /001 
./
./a

[root@bogon /abc]#find ./ -perm /001 -exec mv {} {}.danger \;
[root@bogon /abc]#ll
total 0
-rw-r--r-x 1 root root 0 Mar 18 20:13 a.danger
-rw-r--r-- 1 root root 0 Mar 18 20:13 b
-rw-r--r-- 1 root root 0 Mar 18 20:13 c
-rw-r--r-- 1 root root 0 Mar 18 20:13 d
-rw-r--r-- 1 root root 0 Mar 18 20:13 e
-rw-r--r-- 1 root root 0 Mar 18 20:13 f

[root@bogon /abc]#find ./ -perm -045
./
./a.danger
[root@bogon /abc]#find ./ -perm -005
./
./a.danger
[root@bogon /abc]#find ./ -perm -055
./

                  7.组合测试逻辑:

                              1. 与:-a  默认组合逻辑

                              2. 或:-o

                              3. 非:-not,!

                              4. !A -a !B=!(A -o B)

                              5. !A -o !B=!(A -a B)

7aec54e736d12f2e861ba0df47c2d56285356876.jpg

[root@bogon /abc]#find / -nouser -a -type f    #没有属组的而且是类型是文件的文件
/var/spool/mail/zhao

 

                 8. 处理动作:例如删除等操作,默认为输出至标准输出

                              1. -printf:输出至标准输出,默认的动作

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

                              3. -delete:删除查找到的文件

                              4. -fls /path/to/somefile:把查找到的所有文件的长格式信息保存至指定文件

[root@bogon /abc]#find / -nouser -a -type f -fls /abc/file
[root@bogon /abc]#ls
a.danger  b  c  d  e  f  file
[root@bogon /abc]#cat file 
919756    0 -rw-rw----   1 500      mail            0 Jul 21  2016 /var/spool/mail/zhao
656967    4 -rw-------   1 500      500            65 Sep  3  2016 /home/zhao/.bash_history

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

                                      将没有属组的文件统一处理

                                      a. # find ./ -nouser -a -nogroup -ok chown root:root {} \;

                                      b. 文件一般不允许没有属主属组,假如某个文件b属主为a,删除一个用户a以后,b的属主将为一个序号,假如创建的某个用户c的id为这个序号,则文件的属主将属于c,c将对这个文件有访问权,如果文件里面有重要的东西,,,危险

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

[root@bogon /abc]#mkdir conf
[root@bogon /abc]#find /etc -name "*.conf" -exec cp {} ./conf \;    # 将找到的文件复制到conf目录下面
[root@bogon /abc]#cd conf
[root@bogon /abc/conf]#ls
10-autohint.conf
10-no-sub-pixel.conf
10-sub-pixel-bgr.conf
10-sub-pixel-rgb.conf

                9.注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令,但是有的命令不能接受过长的参数,此时命令会执行失败,另一种可规避此问题

                              1. find | xargs COMMAND 即将找到的路径一个一个的传个后面的命令,见后面的介绍

                10. 注意:

                              1. #find /var -size +1M -o -user zhao -ls  最后的ls命令列出来的是后面的选型对用的目录,而不是所有条件都成立的目录,相当于示例2

                              2. #find /var  -user zhao -ls 

                              3. #find /var -size +1M -o -user zhao -a -ls  -a的优先级比-o的优先级高,所以示例3相当于示例4  -a默认可以不写,代表与的意思

                              4. #find /var -size +1M -o  \( -user zhao -a -ls \)  示例4显示的和示例1显示的是一样的,例1,2,3,4执行效果一样

                              5. #find /var \( -size +1M -o -user zhao \) -ls  如果要符合前面条件都成立的显示出来,则要将前面的括起来,

3.回收站测试

回收站要求:查找回收站目录,把时间超过多长时间的目录及其子目录删除,有可能存在上层目录时间没有到,但是里面的子目录修改时间符合find的条件,被匹配到,这个目录不能删除,下面是测试过程, 最后得出的改进是加入:-maxdepth选项,只查找第一层目录,就符合要求

创建不同时间条件的目录和文件,模仿回收站实际条件

[root@master /tmp/test]#mkdir abc
[root@master /tmp/test]#mkdir bcd
[root@master /tmp/test]#mkdir cde
[root@master /tmp/test]#cd abc/
[root@master /tmp/test/abc]#touch file1
[root@master /tmp/test/abc]#cd ../bcd/
[root@master /tmp/test/bcd]#touch file2
[root@master /tmp/test/bcd]#touch -t 06060606 file2 
[root@master /tmp/test/bcd]#ll
total 0
-rw-r--r-- 1 root root 0 Jun  6 06:06 file2
[root@master /tmp/test/bcd]#cd ../cde/
[root@master /tmp/test/cde]#touch file3
[root@master /tmp/test/cde]#cd ..
[root@master /tmp/test]#touch -t 06050505 cde/
[root@master /tmp/test]#ll
total 12
drwxr-xr-x 2 root root 4096 Aug 28 18:56 abc
drwxr-xr-x 2 root root 4096 Aug 28 18:56 bcd
drwxr-xr-x 2 root root 4096 Jun  5 05:05 cde
[root@master /tmp/test]#cd cde/
[root@master /tmp/test/cde]#ll
total 0
-rw-r--r-- 1 root root 0 Aug 28 18:57 file3
[root@master /tmp/test/cde]#cd ..
[root@master /tmp/test]#ll
total 12
drwxr-xr-x 2 root root 4096 Aug 28 18:56 abc
drwxr-xr-x 2 root root 4096 Aug 28 18:56 bcd
drwxr-xr-x 2 root root 4096 Jun  5 05:05 cde
[root@master /tmp/test]#touch file4
[root@master /tmp/test]#touch -t 05050505 file4 
[root@master /tmp/test]#tree .
.
├── abc
│   └── file1
├── bcd
│   └── file2
├── cde
│   └── file3
└── file4

3 directories, 4 files

进行查找测试

[root@master /tmp/test]#find . -mtime +30 
./file4
./bcd/file2
./cde

[root@master /tmp/test]#find . -maxdepth 1 -mtime +30
./file4
./cde

#查找符合条件
[root@master /tmp/test]#find . -maxdepth 1 -mtime +30 -exec /bin/rm -rf {} \;
[root@master /tmp/test]#ll
total 8
drwxr-xr-x 2 root root 4096 Aug 28 18:56 abc
drwxr-xr-x 2 root root 4096 Aug 28 18:56 bcd
[root@master /tmp/test]#cd bcd/
[root@master /tmp/test/bcd]#ll
total 0
-rw-r--r-- 1 root root 0 Jun  6 06:06 file2


恢复之前的状态
会将所有符合的都删除,这个不好
[root@master /tmp/test]#find . -mtime +30 -exec /bin/rm -rf {} \;
find: `./cde': No such file or directory
[root@master /tmp/test]#ll
total 8
drwxr-xr-x 2 root root 4096 Aug 28 18:56 abc
drwxr-xr-x 2 root root 4096 Aug 28 19:06 bcd
[root@master /tmp/test]#cd bcd/
[root@master /tmp/test/bcd]#ll
total 0

4. 常用范例:

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

a. # find /var -user root -a -group mail -ls

 2. 查找/user目录下不属于root,bin和者hadoop的所有文件或目录,用两种方法

a. # find /usr -not -user root -a -not -user bin -a -not -user hadoop
b. # find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls

  3. 查找/etc目录下最近一周内其内容修改过,且属主不是root用户也不是hadoop用户的文件或目录

a. # find /etc -mtime -7 -a -not -user root -a -not -user hadoop
b. # find /etc -mtime -7 -a -not \(  -user root -o -user hadoop \) -ls

  4. 查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录

a. # find / \( -nouser -o -nogroup \) -a -atime -7

  5. 查找/etc目录下大于1m且类型为普通文件的所有文件

a. # find /etc -size +1M -ls

  6. 查找/etc目录下所有用户都没有写权限的文件

a. # find /etc -not -perm /222 -ls    所有用户都没有写权限<-对立->至少有一个用户有写权限 /222    就这样理解

  7. 查找/etc目录下至少有一类用户没有执行权限的文件

a. # find /etc -not -perm -111 -ls   
b. find /etc \( -user zhao -a -perm -111 \) -ls
c. 如果有多个判断用与连接在一起,最好将前面的判断括起来,不然后面的ls有时候显示的是对应最后一个选项的列表,和前面的用户没有关系,

  8. 查找/etc/init.d目录下所有用户都有执行权限,且其他用户有写权限的所有文件

a. # find /etc -perm -113 -ls

  9.查找以log结尾的文件,并将其复制到test3目录中

find . -name "*.log" -exec cp {} test3 \;

10.查找当前目录下的文件,并显示出来

find . -type f -exec ls -l {} \;

11.查找当前目录下修改时间大于14天的文件并删除,在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!最好移动到不用的目录,定期手动检查批量删除

find . -type f -mtime +14 -exec rm {} \;

未经允许不得转载:江哥架构师笔记 » linux文件查找:find 命令

分享到:更多 ()

评论 抢沙发

评论前必须登录!