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
(2) -iname 'FILENAME':文件名匹配不区分大小写

1.查找a开头文件(重点测试 部分大小写) [xiaobao@libaoliang find]$ find -iname 'a*' 或 [xiaobao@libaoliang find]$ find -iname 'A*' ./a123 都可以找到文件a123
(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
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
(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
[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 命令
(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使用方法类似
(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
(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
(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
(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
-perm MODE :精确匹配,严格匹配。

[root@libaoliang testWildcard]# find ./ find -perm 764 ./c1 my ./c79m ./a123
-perm -MODE:文件权限能完全包含此MODE时才能显示,表示mode中转换成二进制的1在文件权限位里面必须匹配

[root@libaoliang testWildcard]# find ./ find -perm -764 ./c1 my ./c79m ./8yu ./789 ./a123 ./67
-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
(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