Linux文件查找locate/find命令详解


  Linux文件查找命令有locate 和 find。find命令是我们日常工作中比较常用的Linux命令。全面的掌握这个命令可以使很多操作达到事半功倍的效果。

一.locate:非实时,模式匹配,查找是根据全系统文件数据库数据库进行的。查找速度快。

  updatedb:手动生成文件数据库(若新装的linux系统,此时没有文件数据库,可用updatedb命令手动生成)

二.find:实时,精确,支持众多查找标准,遍历指定目录中的所有文件完成查找,速度慢。

  find的用法:find  查找路径  查找标准  查找到后的处理动作

    查找路径:默认为当前目录

    查找标准:默认为指定路径下的所有文件

    处理动作:默认为显示。

  1.查找标准

    (1) -name 'FILENAME':对文件名作精确匹配

     
文件名通配
    *:任意长度的任意字符
    ?:任意单个字符
    []:指定范围内的任意单个字符  [a-m],[A-Z] ,[0-9],[a-zA-Z]
        [:space:]:空白字符
        [:punct:]:标点符号
        [:lowe:] :小写字符     "[[:lower:]]" instead of "[a-z]"
        [:upper:]:大写字母
        [:alpha:]:大小写字母
        [:digit:]:数字
        [:alnum:]:数字和大小写字母
        使用 man 7 glob 可以获得以上列表
    [^]:配置指定范围之外的任意单个字符  例如 : [^0-9]*  表示 匹配非数字开头的文件
文件名通配符
     
-name 'FILENAME' 查找事例
1.在/home/xiaobao/CommandTest/find 下 创建a123,cd6,c79m,c1 my,m.z,k 67,8yu,789等文件,以上文件是以逗号隔开的,其他部分都是文件名的组成部分。
     [xiaobao@libaoliang find]$ touch a123 cd6 c79m c1 my m.z k 67 8yu 789
    [xiaobao@libaoliang find]$ cd /home/xiaobao/CommandTest/find/
    [xiaobao@libaoliang find]$ ls -l
    total 0
    -rw-r--r--. 1 xiaobao policeman 0 Jun 15 17:07 789
    -rw-r--r--. 1 xiaobao policeman 0 Jun 15 17:07 8yu
    -rw-r--r--. 1 xiaobao policeman 0 Jun 15 17:07 a123
    -rw-r--r--. 1 xiaobao policeman 0 Jun 15 17:07 c1 my
    -rw-r--r--. 1 xiaobao policeman 0 Jun 15 17:07 c79m
    -rw-r--r--. 1 xiaobao policeman 0 Jun 15 17:07 cd6
    -rw-r--r--. 1 xiaobao policeman 0 Jun 15 17:07 k 67
    -rw-r--r--. 1 xiaobao policeman 0 Jun 15 17:07 m.z
到此 文件创建成功
2.查找所有/home/xiaobao/CommandTest/find目录下以a或m开头的文件
    [xiaobao@libaoliang find]$ find /home/xiaobao/CommandTest/find/ -name '[am]*'
    切换到 /home/xiaobao/CommandTest/find/目录,直接执行
    [xiaobao@libaoliang find]$ find  -name '[am]*'
    ./m.z
    ./a123
3.显示所有文件名中包含了数字的文件
   [xiaobao@libaoliang find]$ find -name '*[0-9]*'
    或
    [xiaobao@libaoliang find]$ find -name '*[[:digit:]]*'
    ./c1 my
    ./c79m
    ./cd6
    ./8yu
    ./789
    ./k 67
    ./a123
4.显示文件名中包含了非字母或数字的特殊符号文件
    [xiaobao@libaoliang find]$ find -name '*[^[:alnum:]]*'
    或
    [xiaobao@libaoliang find]$ find -name '*[^a-zA-Z0-9]*'
    .
    ./c1 my
    ./m.z
    ./k 67
-name 'FILENAME' 查找事例

    (2) -iname 'FILENAME':文件名匹配不区分大小写    

     
1.查找a开头文件(重点测试 部分大小写)
   [xiaobao@libaoliang find]$ find -iname 'a*'
    或
    [xiaobao@libaoliang find]$ find -iname 'A*'
    ./a123
   都可以找到文件a123
-iname 'FILENAME'查找事例

    (3) -regex PATTERN:基于正则表达式进行文件名匹配

     
基本正则表达式(默认贪婪模式):Regular EXPression,REGRXP
    元字符:
        .  : .表示任意单个字符
    匹配次数
        * :匹配其前面字符任意次(贪婪模式,默认情况下,匹配最长的匹配)
            .*:任意长度的任意字符
        \?:匹配其前面的字符1次或0次
        \{m,n\}:匹配其前面的字符最少m次,最多n次
    位置锚定
        ^:锚定行首,此字符后面的任意内容必须出现在行首
        $:锚定行尾,此字符前面的任意内容必须出现在行尾
            ^$:空白行
        \< 或 \b:锚定词首,其后面的任意字符必须作为单词首部出现
        \> 或 \b:锚定词尾,其前面的任意字符必须作为单词尾部出现
    []:匹配指定范围内的任意单个字符
    [^]:匹配指定范围外的任意单个字符
    字符集合 
        [:digit:]  数字,[:lower:] 小写字符,[:upper:] 大写字符,[:punct:] 标点符号,[:space:] 空白字符,[:alpha:] 大小写字符,[:alnum:] 数字 大小写字母
    分组:
        \( \):分组,主要用于后向引用,
        \1:表示 引用第一个括号匹配 出现过的内容
        \2:表示 引用第二个括号匹配 出现过 的内容
扩展表达式
    字符匹配
        .  : .表示任意单个字符
        []:匹配指定范围内的任意单个字符
        [^]:匹配指定范围外的认字单个字符
    次数匹配
       * :匹配其前面字符任意次
        ?:匹配其前面的字符1次或0次
        +:匹配其前面的字符最少1次
        {m,n} 匹配其前面的字符最少m次,最多n次
    位置锚定
        ^:锚定行首,此字符后面的任意内容必须出现在行首
        $:锚定行尾,此字符前面的任意内容必须出现在行尾
       \< :锚定词首,其后面的任意字符必须作为单词首部出现
        \> :锚定词尾,其前面的任意字符必须作为单词尾部出现    
    分组:
        ():分组
        \1,\2,\3 :表示对前面分组的引用
    或者
        |: 表示或者
正则表达式
    1.显示所有以数字结尾且文件名中不包含空白的文件
    [xiaobao@libaoliang find]$ find ./ -regextype posix-extended -regex '[^[:space:]]*[0-9]+'
    必须要指定 regextype type,否则无法正确匹配

    (4) -user USERNAME:根据属主查找

    ls /home/xiaobao/
     
drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 21:15 Desktop
drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Documents
drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Downloads
-rw-r--r--. 1 root    root       191 May 18 17:46 dump.rdb
drwxr-xr-x. 3 xiaobao policeman 4096 Apr 22 20:04 java
drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Music
-rw-r--r--. 1 xiaobao policeman 1998 Apr 25 23:36 mycal
-rw-r--r--. 1 root    root        31 May 25 20:53 myfile.txt
-rw-rw-r--. 1 xiaobao policeman  252 May 10 21:44 mytest1.java
-rw-r--r--. 1 root    root        97 May 10 16:16 mytest2.java
drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Pictures
drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Public
-rw-r--r--. 1 root    root      1358 Apr 27 21:22 ShowUsers.class
-rw-r--r--. 1 root    root       744 Apr 27 21:22 ShowUsers.java
drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Templates
drwxr-xr-x. 2 root    root      4096 May 24 17:46 testWildcard
drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Videos
ls /home/xiaobao/结果

      find  /home/xiaobao/ -user root

     
/home/xiaobao/.showUsers.java.swp
/home/xiaobao/myfile.txt
/home/xiaobao/ShowUsers.java
/home/xiaobao/testWildcard
/home/xiaobao/testWildcard/c1 my
/home/xiaobao/testWildcard/c79m
/home/xiaobao/testWildcard/测试通配符.txt
/home/xiaobao/testWildcard/m.z
/home/xiaobao/testWildcard/cd6
/home/xiaobao/testWildcard/8yu
/home/xiaobao/testWildcard/789
/home/xiaobao/testWildcard/k 67
/home/xiaobao/testWildcard/a123
/home/xiaobao/testWildcard/67
/home/xiaobao/ShowUsers.class
/home/xiaobao/dump.rdb
/home/xiaobao/mytest2.java
find /home/xiaobao -user root结果

     (5) -group GROUPNAME:根据属组查找   

    ls /home/xiaobao/
     
改变mytest1.java文件的属组
    [root@libaoliang xiaobao]# chgrp xiaoming mytest1.java 
查看文件情况
    [root@libaoliang xiaobao]# ls /home/xiaobao/ -l
    total 72
    drwxr-xr-x. 3 xiaobao policeman 4096 Jun 15 17:05 CommandTest
    drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 21:15 Desktop
    drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Documents
    drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Downloads
    -rw-r--r--. 1 root    root       191 May 18 17:46 dump.rdb
    drwxr-xr-x. 3 xiaobao policeman 4096 Apr 22 20:04 java
    drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Music
    -rw-r--r--. 1 xiaobao policeman 1998 Apr 25 23:36 mycal
    -rw-r--r--. 1 root    root        31 May 25 20:53 myfile.txt
    -rw-rw-r--. 1 xiaobao xiaoming   252 May 10 21:44         mytest1.java
    -rw-r--r--. 1 root    root        97 May 10 16:16 mytest2.java
    drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Pictures
    drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Public
    -rw-r--r--. 1 root    root      1358 Apr 27 21:22 ShowUsers.class
    -rw-r--r--. 1 root    root       744 Apr 27 21:22 ShowUsers.java
    drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Templates
    drwxr-xr-x. 2 root    root      4096 May 24 17:46 testWildcard
    drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Videos
ls /home/xiaobao/ -l 结果

     [root@libaoliang xiaobao]# find ./ -group xiaoming -ls

     
[root@libaoliang xiaobao]# find ./ -group xiaoming -ls
782498    4 -rw-rw-r--   1 xiaobao  xiaoming      252 May 10 21:44 ./mytest1.java
791771    0 -rw-r--r--   1 xiaobao  xiaoming        0 Jun 15 17:07 ./CommandTest/find/c79m

这里 find命令最后跟 -ls,可以使查找出来的结果以详细格式显示,相当于使用 ls -l 命令
find ./ -group xiaoming -ls执行结果  

    (6)-uid UID:根据UID查找
       -gid GID:根据GID查找

     
查看 xiaoming 用户的 uid 和 gid
    [root@libaoliang xiaobao]# id xiaoming
    uid=501(xiaoming) gid=501(xiaoming) groups=501(xiaoming)
-gid事例
    [root@libaoliang xiaobao]# find ./ -gid 501 -ls
    782498    4 -rw-rw-r--   1 xiaobao  xiaoming      252 May 10 21:44 ./mytest1.java
    791771    0 -rw-r--r--   1 xiaobao  xiaoming        0 Jun 15 17:07 ./CommandTest/find/c79m

uid 和 gid使用方法类似
-uid 和 -gid事例

    (7)-nouser:查找没有属主的文件

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

     
用testuser 用户在/home/testuser目录下创建 aaa文件,用root用户使用userdel testuser命令删除testuser用户, 这时候usertest用户被删除,但是家目录及文件还存在,这时候,aaa文件即已经成为无属主 和 无属组的文件。
[root@libaoliang xiaobao]# ls /home/testuser/ -l
 total 0
-rw-rw-r--. 1 4007 4007 0 Jun 15 21:03 aaa

[root@libaoliang xiaobao]# find /home/testuser/ -nouser
/home/testuser/
/home/testuser/.bash_logout
/home/testuser/.mozilla
/home/testuser/.mozilla/plugins
/home/testuser/.mozilla/extensions
/home/testuser/.bash_profile
/home/testuser/.bashrc
/home/testuser/aaa
/home/testuser/.gnome2
/home/testuser/.bash_history

[root@libaoliang xiaobao]# find /home/testuser/ -nogroup
/home/testuser/
/home/testuser/.bash_logout
/home/testuser/.mozilla
/home/testuser/.mozilla/plugins
/home/testuser/.mozilla/extensions
/home/testuser/.bash_profile
/home/testuser/.bashrc
/home/testuser/aaa
/home/testuser/.gnome2
/home/testuser/.bash_history
View Code    

    (8) -type
      f:普通文件
      d:目录
      c:字符设备
      b:块设备
      l:连接文件

      p:管道设备
      s:套接字设

     
[root@libaoliang testWildcard]# find /home/xiaobao/testWildcard/ -type f -ls
786367    0 -rw-r--r--   1 root     root            0 May 24 17:45 /home/xiaobao/testWildcard/c1\343\200\200my
786365    0 -rw-r--r--   1 root     root            0 May 24 17:45 /home/xiaobao/testWildcard/c79m
782449    4 -rw-r--r--   1 root     root          532 May 24 18:05 /home/xiaobao/testWildcard/\346\265\213\350\257\225\351\200\232\351\205\215\347\254\246.txt
786372    0 -rw-r--r--   1 root     root            0 May 24 17:46 /home/xiaobao/testWildcard/m.z
786364    0 -rw-r--r--   1 root     root            0 May 24 17:44 /home/xiaobao/testWildcard/cd6
786380    0 -rw-r--r--   1 root     root            0 May 24 17:46 /home/xiaobao/testWildcard/8yu
786387    0 -rw-r--r--   1 root     root            0 May 24 17:46 /home/xiaobao/testWildcard/789
786374    0 -rw-r--r--   1 root     root            0 May 24 17:46 /home/xiaobao/testWildcard/k\343\200\20067
786358    0 -rw-r--r--   1 root     root            0 May 24 17:44 /home/xiaobao/testWildcard/a123
786377    0 -rw-r--r--   1 root     root            0 May 24 17:46 /home/xiaobao/testWildcard/67
-type使用事例

    (9) -size
      [+|-]#k:例如 1k表示小于等于1k,+10k表示大于10k,-10表示小于10k
      #M
      #G

    
[root@libaoliang testWildcard]# find -size -10k
.
./c1 my
./c79m
./测试通配符.txt
./m.z
./cd6
./8yu
./789
./k 67
./a123
./67
-size使用事例

    (10) 组合条件
      -a:与;不写符号的话,默认为 -a 与关系
      -o:或
      -not:非

    1.查找/tmp目录下,不是目录 并且 不是套接字类型的文件
        find /tmp -not -type d -a -not -type s
    2./tmp目录下,属主不是user1又不是user2的文件
        find /tmp -not -user user1 -a -not -user user2
    3./tmp目录下,属主不是user1 或者 类型不是目录的
        find /temp -not -user user1 -o -not -type d

    (11) 时间

      -ctime:以天为单位通过change time查找文件。
      -atime:以天为单位通过access time查找文件。
      -mtime:以天为单位通过modify time查找文件。
      -mmin:以分钟为单位通过modify time查找文件。
      -amin:以分钟为单位通过access time查找文件。
      -cmin:以分钟单位通过change time查找文件。

      [+|-]#:例如:-atime -5:表示5天内访问过的文件
           -atime 5 :表示 离当前时间刚好5天的那一刻访问的我文件
           -atime +5 :表示5天之外(5天之前)访问过的往文件

     1. 查找5天前改变过的文件
        [root@libaoliang testWildcard]# find /home/xiaobao/testWildcard/ -ctime +5 -ls
        798393    4 drwxr-xr-x   2 root     root         4096 May 24 17:46 /home/xiaobao/testWildcard/
        786372    0 -rw-r--r--   1 root     root            0 May 24 17:46 /home/xiaobao/testWildcard/m.z
        786364    0 -rw-r--r--   1 root     root            0 May 24 17:44 /home/xiaobao/testWildcard/cd6
        786380    0 -rw-r--r--   1 root     root            0 May 24 17:46 /home/xiaobao/testWildcard/8yu
        786387    0 -rw-r--r--   1 root     root            0 May 24 17:46 /home/xiaobao/testWildcard/789
        786358    0 -rw-r--r--   1 root     root            0 May 24 17:44 /home/xiaobao/testWildcard/a123
        786377    0 -rw-r--r--   1 root     root            0 May 24 17:46 /home/xiaobao/testWildcard/67
     2.查找5天内访问过的文件
        [root@libaoliang testWildcard]# find /home/xiaobao/testWildcard/ -atime -5
        /home/xiaobao/testWildcard/
        /home/xiaobao/testWildcard/测试通配符.txt

     (12)按权限查找

      
    [root@libaoliang testWildcard]# ls -l
    total 4
    -rwxrwxr--. 1 root root   0 May 24 17:46 67
    -rwxrwxr--. 1 root root   0 May 24 17:46 789
    -rwxrwxr--. 1 root root   0 May 24 17:46 8yu
    -rwxrw-r-x. 1 root root   0 May 24 17:44 a123
    -rwxrw-r-x. 1 root root   0 May 24 17:45 c1 my
    -rwxrw-r-x. 1 root root   0 May 24 17:45 c79m
    -rw-r--r--. 1 root root   0 May 24 17:44 cd6
    -rw-r--r--. 1 root root   0 May 24 17:46 k 67
    -rw-r--r--. 1 root root   0 May 24 17:46 m.z
    -rw-r--r--. 1 root root 532 May 24 18:05 测试通配符.txt
ls -l

      -perm MODE :精确匹配,严格匹配。

        
    [root@libaoliang testWildcard]# find ./ find -perm 764
    ./c1 my
    ./c79m
    ./a123
find ./ -perm 764查找结果

      -perm -MODE:文件权限能完全包含此MODE时才能显示,表示mode中转换成二进制的1在文件权限位里面必须匹配

        
    [root@libaoliang testWildcard]# find ./ find -perm -764
    ./c1 my
    ./c79m
    ./8yu
    ./789
    ./a123
    ./67
find ./ -perm -764查找结果

      -perm +MODE :(和 -perm /MODE 效果一样)只要有一位匹配到即可,任意匹配一位即可

        
    [root@libaoliang testWildcard]# find ./ -perm +010 -ls
    798393    4 drwxr-xr-x   2 root     root         4096 May 24 17:46 ./
    786380    0 -rwxrwxr--   1 root     root            0 May 24 17:46 ./8yu
    786387    0 -rwxrwxr--   1 root     root            0 May 24 17:46 ./789
    786377    0 -rwxrwxr--   1 root     root            0 May 24 17:46 ./67
find ./ -perm +010 -ls查找结果

    (13)-newer f1 !f2 匹配比文件f1新却比f2旧的文件

    (14)-prune 忽略某个目录

 

 

 2.处理动作:
    -print:显示
    -ls:类似 ls -l的形式显示每一个文件的详细
    -ok COMMAND {}\; : {}表示占位符,必须以\;结尾,每次操作都需要用户确认
    -exec COMMAND {} \;
      例如: find ./ -perm 006 -exec chmod o-w {} \; :将所有其他组中所有具有读写权限的文件,去掉写权限
      find ./ -perm -020 -ok mv {} {}.new \; :将所有具有写权限的文件,重命名为原文件名加 .new
      find ./ -name "*.sh" -a -perm -111 -exec chmod o-x {} \; :找到也.sh结尾 而且所有用户都有执行权限,把其他用户的执行权限去掉

 

 

find命令练习

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

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

  2.查找/user目录下不属于root,bin 或 student的文件

     [root@libaoliang ~]# find /usr/ -not -user root -a -not -user bin -a -not -user student -ls 

     [root@libaoliang ~]# find /user -not \(-user -root -o -user bin -o -user student\) 
  3.查找/etc目录下最近一周内内容修改过且不属于root及student用户的文件

     [root@libaoliang ~]# find /etc/ -mtime -7 -a -not -user root -a -not -user student 

     [root@libaoliang ~]# find /etc/ -mtime -7 -a -not \( -user root -o -user student\) 
  4.查找当前系统上没有属组或属组且最近一天内层被访问过的文件,并将其属主属组均修改为root

     [root@libaoliang ~]# find / \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \; 
  5.查找/etc目录下大于1M的文件,并将其文件名写入/tmp/etc.largefiles文件中

     [root@libaoliang ~]# find /etc/ -size +1M >> /tmp/etc.largefiles 

     [root@libaoliang ~]# find /etc/ -size +1M | xargs echo >> /tmp/etc.largefiles #多个文件名以空格分割字符串显示在一行 
  6.查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息

     [root@libaoliang ~]# find /etc/ -not -perm /222 -ls 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM