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

时间:2022-11-17 09:20:01

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

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

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

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

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

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

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

    处理动作:默认为显示。

  1.查找标准

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

     Linux文件查找locate/find命令详解Linux文件查找locate/find命令详解
文件名通配
*:任意长度的任意字符
?:任意单个字符
[]:指定范围内的任意单个字符 [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]* 表示 匹配非数字开头的文件
文件名通配符
     Linux文件查找locate/find命令详解Linux文件查找locate/find命令详解
-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':文件名匹配不区分大小写    

     Linux文件查找locate/find命令详解Linux文件查找locate/find命令详解
1.查找a开头文件(重点测试 部分大小写)
[xiaobao@libaoliang
find]$ find -iname 'a*'

[xiaobao@libaoliang
find]$ find -iname 'A*'
.
/a123
都可以找到文件a123
-iname 'FILENAME'查找事例

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

     Linux文件查找locate/find命令详解Linux文件查找locate/find命令详解
基本正则表达式(默认贪婪模式):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/
     Linux文件查找locate/find命令详解Linux文件查找locate/find命令详解
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

     Linux文件查找locate/find命令详解Linux文件查找locate/find命令详解
/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/
     Linux文件查找locate/find命令详解Linux文件查找locate/find命令详解
改变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

     Linux文件查找locate/find命令详解Linux文件查找locate/find命令详解
[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查找

     Linux文件查找locate/find命令详解Linux文件查找locate/find命令详解
查看 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:查找没有属组的文件

     Linux文件查找locate/find命令详解Linux文件查找locate/find命令详解
用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:套接字设

     Linux文件查找locate/find命令详解Linux文件查找locate/find命令详解
[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

    Linux文件查找locate/find命令详解Linux文件查找locate/find命令详解
[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)按权限查找

      Linux文件查找locate/find命令详解Linux文件查找locate/find命令详解
    [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 :精确匹配,严格匹配。

        Linux文件查找locate/find命令详解Linux文件查找locate/find命令详解
    [root@libaoliang testWildcard]# find ./ find -perm 764
.
/c1 my
.
/c79m
.
/a123
find ./ -perm 764查找结果

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

        Linux文件查找locate/find命令详解Linux文件查找locate/find命令详解
    [root@libaoliang testWildcard]# find ./ find -perm -764
.
/c1 my
.
/c79m
.
/8yu
.
/789
.
/a123
.
/67
find ./ -perm -764查找结果

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

        Linux文件查找locate/find命令详解Linux文件查找locate/find命令详解
    [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查找结果

  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