Linux系统常用的文件查找命令是:locate和find两个命令。

      相对来说,locate命令由于系统会自动周期性的构建索引库,所以要比find命令查找速度要快,但是locate命令对由于其于文件的查找主要依赖于事先构建好的索引库,所以只能对文件进行模糊匹配,同时在精确度上来说比find差了很多,也无法准确反映系统文件的真实相关情况。

         

      下面重点说下find命令。

      使用格式 :   find  [查找起始路径]  [查找条件或规则]  [查找完后所执行的动作]

           [查找起始路径]: find命令在不指定查找目录的情况下,默认是对当前目录进行遍历查找。

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

            [查找完后所执行的动作]:对符合查找条件的文件做出的操作,例如删除等操作;默认为输出至标准输出;


    (1)根据文件名查找:

              -name  "pattern"

              -iname "pattern"

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

   (2)文件类型:-type

                 f :普通文件 ,

                 d: 目录文件 , 

                 l :符号链接文件 ,

                 p :管道文件 ,

                 c :字符设备文件 ,

                 b: 块设备文件,

                 s :socket套接字文件

   (3)根据文件从属关系查找:

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

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

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

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

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

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

[root@xlogin data]# find  -type f -ls
 19150    0 -rw-r--r--   1 root     root            0 12月 16 21:24 ./file/type-f

 [root@xlogin data]# find -name file -ls
 19149    0 drwxr-xr-x   2 user3    user3           6 12月 16 21:25 ./file
 
[root@xlogin data]# userdel -r user1
[root@xlogin data]# find /data -nouser -ls
67227040    0 drwxr-xr-x   2 1001     user3           6 12月 16 21:25 /data/nouser

[root@xlogin data]# userdel -r user2
[root@xlogin data]# find /data -nogroup -ls
100664274    0 drwxr-xr-x   2 user3    1002            6 12月 16 21:25 /data/nogroup

[root@xlogin data]# find /data -user user3 -ls
100664274    0 drwxr-xr-x   2 user3    1002            6 12月 16 21:25 /data/nogroup
 19149    0 drwxr-xr-x   2 user3    user3          19 12月 16 21:34 /data/file
 
 [root@xlogin data]# find  /data -iname  nogroup -ls
100664274    0 drwxr-xr-x   2 user3    1002            6 12月 16 21:25 /data/nogroup
33558009    0 drwxr-xr-x   2 root     root            6 12月 16 21:36 /data/NOGROUP


(4)组合测试:

         与:-a, 默认组合逻辑,两者必须满足

         或:-o   满足其中一个条件即可

         非:-not, !非

/data目录下所有属于gid为1003,但属主不是root的所有文件,且类型为文件。
[root@xlogin data]# find /data/ -type f -a -gid 1003  -ls
 19150    0 -rw-r--r--   1 root     user3           0 12月 16 21:34 /data/file/type-f
 19542    0 -rw-r--r--   1 user3    user3           0 12月 16 21:54 /data/file/test
[root@xlogin data]# find /data/ -type f -a -gid 1003 -not -user root -ls
 19542    0 -rw-r--r--   1 user3    user3           0 12月 16 21:54 /data/file/test


(5)根据文件的大小查找:

         -size [+|-]#UNIT

         常用单位:k, M, G

[root@xlogin data]# find /usr/bin/ -size 60k -ls
2051046   60 -rwxr-xr-x   1 root     root        60784 3月  6  2015 /usr/bin/pactl
[root@xlogin data]# find /usr/bin/ -size +10M -ls
680027 10284 -rwxr-xr-x   1 root     root     10527312 6月 10  2014 /usr/bin/virtuoso-t
[root@xlogin data]# du -sh /usr/bin/virtuoso-t
11M	/usr/bin/virtuoso-t


(6)根据时间戳查找:

        以“天”为单位:

              -atime :Access, 最近访问时间

              -mtime :Modify,最近修改时间

              -ctime :Change,最近改变时间


         以“分钟”为单位:

       -mtime  -n +n              #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
       -atime  -n +n              #按文件访问时间来查找文件,-n指n天以内,+n指n天以前
       -ctime  -n +n              #按文件创建时间来查找文件,-n指n天以内,+n指n天以前


[root@xlogin data]# stat /data/passwd 
  文件:"/data/passwd"
  大小:27832     	块:56         IO 块:4096   普通文件
设备:802h/2050d	Inode:67227040    硬链接:1
权限:(0755/-rwxr-xr-x)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:default_t:s0
最近访问:2015-12-16 22:18:59.441496670 +0800
最近更改:2015-12-16 22:18:59.467496708 +0800
最近改动:2015-12-16 22:18:59.467496708 +0800
创建时间:-
[root@xlogin data]# chmod 644 /data/passwd 
[root@xlogin data]# stat /data/passwd       #文件的ctime发生了变化
  文件:"/data/passwd"
  大小:27832     	块:56         IO 块:4096   普通文件
设备:802h/2050d	Inode:67227040    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:default_t:s0
最近访问:2015-12-16 22:18:59.441496670 +0800
最近更改:2015-12-16 22:18:59.467496708 +0800
最近改动:2015-12-16 22:19:50.777569674 +0800
创建时间:-
[root@xlogin data]# cat /bin/lsattr >/data/passwd   #文件的ctime和mtime都发生了变化
[root@xlogin data]# stat /data/passwd 
  文件:"/data/passwd"
  大小:11520     	块:24         IO 块:4096   普通文件
设备:802h/2050d	Inode:67227040    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:default_t:s0
最近访问:2015-12-16 22:18:59.441496670 +0800
最近更改:2015-12-16 22:20:42.573643324 +0800
最近改动:2015-12-16 22:20:42.573643324 +0800
创建时间:-
[root@xlogin data]# touch /data/passwd 
[root@xlogin data]# stat /data/passwd    #文件的atime、ctime、mtime均发生了变化。
  文件:"/data/passwd"
  大小:11520     	块:24         IO 块:4096   普通文件
设备:802h/2050d	Inode:67227040    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:default_t:s0
最近访问:2015-12-16 22:22:43.312815007 +0800
最近更改:2015-12-16 22:22:43.312815007 +0800
最近改动:2015-12-16 22:22:43.312815007 +0800
创建时间:-

经过测试,我们得出结论:

     无论文件的属性还是内容发生变化,文件的ctime都会发生改变,但只有文件的内容发生修改时,文件的mtime才会发生变化。当对文件内容进行查看等操作时,文件的atime则会发生变化。

查找var目录下,1天内被更改过的文件 
    [root@xlogin data]# find /var -mtime -1 -type f -print  

查找var目录下,2天前被更改过的文件 
     [root@xlogin data]# find /var/ -mtime +2 -type f 

查找var目录下,7天内被访问过的文件 
     [root@xlogin data]# find /var/ -atime -7 -type f

查找var目录下,7天前被访问的文件 
      [root@xlogin data]# find . -atime +7 -type f   

查找var目录下,一天内状态被改变的文件 
      [root@xlogin data]# find . -ctime -1 -type f -print   

查找var目录下,一天前状态被改变的文件 
      [root@xlogin data]# find . -ctime +1 -type f -print   

查找var目录下,10分钟以前状态被改变的文件 
      [root@xlogin data]# find . -cmin +10 -type f -print


(8)根据权限查找:

         -perm  [/|-]mode

  • mode:精确权限匹配;

  • /mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足,9位权限之间存在“或”关系;

  • -mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足,9位权限之间存在“与”关系;

查找/etc目录下所有用户都没有写权限的文件;
[root@xlogin data]# find /etc -not -perm /222 -type f -ls 					
					
查找/etc目录至少有一类用户没有执行权限的文件;
[root@xlogin data]# find /etc -not -perm -111 -type f -ls


(9)处理动作:

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

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

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

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

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

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

     

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

[root@xlogin data]# find . -name 'del.txt' -ok rm {} \; #查找del.txt并删除,删除前提示确认       
[root@xlogin data]# find . -name 'aa.txt' -exec cp {} {}.bak \; #查找aa.txt 并备份为aa.txt.bak


 在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行。

 但是有些命令不能接受过长的参数,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这种情况下,也就正是xargs命令出现的时候了,xargs是一条Unix和类Unix操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。

 find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

 在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高,而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

 另外很多时候,有些命令不支持使用| 管道来传递参数,但是我们又必须使用,所以这个时候就是xargs大展身手的时候了!

 先看几个普通的例子:

[root@xlogin data]# ll test/
总用量 8
dr-xr-xr-x. 4 root root 4096 12月 16 22:36 boot
-rw-r--r--. 1 root root 1750 12月 16 22:36 passwd
[root@xlogin data]# find /data/test/ -type f -exec rm {} \;
[root@xlogin data]# ls test/
boot
[root@xlogin data]# ll /data/test/boot/
总用量 0
drwxr-xr-x. 2 root root  6 12月 16 22:37 grub
drwxr-xr-x. 6 root root 58 12月 16 22:37 grub2
[root@xlogin data]# find /data/test/ -type f |xargs rm -rf
[root@xlogin data]# ll /data/
总用量 0

    OK,来看下边的:

   

wKioL1Z2rLaTffl2AAChSnNcfEk604.jpg