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)
[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 {} \;
–
–
–
评论前必须登录!
注册