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