linux文件查找find命令
1、文件查找
基本介紹
在文件系統上查找符合條件的文件
linux上常見的文件查找工具:find命令
查找分類
實時查找
精確查找
基本語法
find [options..] [查找的路徑] [查找條件] [處理動作]
查找的路徑:指定查找目標文件具體路徑。默認為當前目錄
查找條件:指定的查找標准,可以是文件名、大小、類型、權限、屬組或者屬主等標准進行查找。默認為找出指定路徑下的所有文件
處理動作:對查找符合的文件做什么操作。默認輸出至屏幕
查找條件有哪些
根據文件名查找:
-name “文件名稱”:文件名稱支持使用glob,也就是可以是用*、?、[]、[^]。使用-name進行文件查找時,是嚴格區分文件大小寫的
使用案例
[root@oldboy ~]# find /etc -name "fs*"
/etc/fstab
-iname “文件名稱”:文件名稱支持glob,使用-iname進行查找時,不區分文件的大小寫
-regex PATTERN:以PATTERN去匹配整個路徑字符串,而不僅僅是文件名稱
根據文件的屬組、屬主查找
-user USERNAME:查找屬主為USERNAME的文件
-group GROUPNAME:查找屬組為GROUPNAME的文件
-uid UID:查找屬主為指定UID號的文件
-gid GID:查找屬組為指定GID號的文件
-nouser:查找沒有屬主的文件(即用戶已經被刪除,在文件屬性中的屬主列屬性中只剩下一個UID)
-nogroup:查找沒有屬組的文件(即屬組已經被刪除,在文件屬性中屬組列屬性只剩下一個GID)
注意:當我們把一個用戶刪除時,屬於這個用戶的文件的屬組或者屬主都變成相應的UID號了
根據文件類型查找
-type TYPE
TYPE包含下列幾種
f:普通文件
d:目錄文件
l:符號鏈接文件
s:套接字文件
p:管道文件
b:塊設備文件
c:字符設備文件
組合條件查找
-a:與(可以省略)
-o:或
-not或者 ! :非
注意
組合條件查找時有時需要把組合條件執行了再執行處理動作,因此,這個是組合條件就需要加括號(括號需要轉義)避免出錯。因為組合條件可能和后邊的處理動作產生歧義,造成意想不到的效果
產生這樣結果的原因:通過處理動作執行后的結果會被輸入到屏幕上,而組合條件沒有加括號的話,只有組合條件中的最后一個條件與處理動作進行組和輸出了
案例演示

[root@oldboy ~]# find /home -nouser -o -nogroup -ls 394369 4 -rw-r--r-- 1 oldboy 500 176 Jul 24 2015 /home/oldboy/.bash_profile 394370 4 -rw-r--r-- 1 oldboy 500 124 Jul 24 2015 /home/oldboy/.bashrc 394565 0 -rw-rw-r-- 1 oldboy 500 0 Mar 3 1978 /home/oldboy/2.txt 394566 4 drw-r----- 2 oldboy 500 4096 Mar 3 1978 /home/oldboy/test 394375 4 -rw------- 1 oldboy 500 816 Dec 25 01:19 /home/oldboy/.viminfo 394373 4 -rw------- 1 oldboy 500 695 Mar 3 1978 /home/oldboy/.bash_history 394128 4 -rw------- 1 oldboy 500 17 Mar 30 1978 /home/oldboy/.history 394371 4 -rw-r--r-- 1 oldboy 500 18 Jul 24 2015 /home/oldboy/.bash_logout 394372 4 drwxrwxr-x 2 oldboy 500 4096 Dec 25 01:19 /home/oldboy/script 394374 4 -rw-rw-r-- 1 oldboy 500 164 Dec 25 01:19 /home/oldboy/script/functions [root@oldboy ~]# find /home -nouser -ls 394558 4 drwx------ 2 512 514 4096 Jan 17 10:54 /home/gentoo 394559 4 -rw-r--r-- 1 512 514 176 Jul 24 2015 /home/gentoo/.bash_profile 394560 4 -rw-r--r-- 1 512 514 124 Jul 24 2015 /home/gentoo/.bashrc 394561 4 -rw-r--r-- 1 512 514 18 Jul 24 2015 /home/gentoo/.bash_logout 401181 4 drwx------ 3 514 517 4096 Mar 4 18:02 /home/com 401182 4 -rw-r--r-- 1 514 517 176 Jul 24 2015 /home/com/.bash_profile 401183 4 drwxr-xr-x 4 514 517 4096 Mar 30 1978 /home/com/.mozilla 401184 4 drwxr-xr-x 2 514 517 4096 Aug 18 2010 /home/com/.mozilla/extensions 401185 4 drwxr-xr-x 2 514 517 4096 Aug 18 2010 /home/com/.mozilla/plugins 401186 4 -rw-r--r-- 1 514 517 124 Jul 24 2015 /home/com/.bashrc 401187 4 -rw-r--r-- 1 514 517 18 Jul 24 2015 /home/com/.bash_logout [root@oldboy ~]# find /home -nogroup -ls 394558 4 drwx------ 2 512 514 4096 Jan 17 10:54 /home/gentoo 394559 4 -rw-r--r-- 1 512 514 176 Jul 24 2015 /home/gentoo/.bash_profile 394560 4 -rw-r--r-- 1 512 514 124 Jul 24 2015 /home/gentoo/.bashrc 394561 4 -rw-r--r-- 1 512 514 18 Jul 24 2015 /home/gentoo/.bash_logout 394369 4 -rw-r--r-- 1 oldboy 500 176 Jul 24 2015 /home/oldboy/.bash_profile 394370 4 -rw-r--r-- 1 oldboy 500 124 Jul 24 2015 /home/oldboy/.bashrc 394565 0 -rw-rw-r-- 1 oldboy 500 0 Mar 3 1978 /home/oldboy/2.txt 394566 4 drw-r----- 2 oldboy 500 4096 Mar 3 1978 /home/oldboy/test 394375 4 -rw------- 1 oldboy 500 816 Dec 25 01:19 /home/oldboy/.viminfo 394373 4 -rw------- 1 oldboy 500 695 Mar 3 1978 /home/oldboy/.bash_history 394128 4 -rw------- 1 oldboy 500 17 Mar 30 1978 /home/oldboy/.history 394371 4 -rw-r--r-- 1 oldboy 500 18 Jul 24 2015 /home/oldboy/.bash_logout 394372 4 drwxrwxr-x 2 oldboy 500 4096 Dec 25 01:19 /home/oldboy/script 394374 4 -rw-rw-r-- 1 oldboy 500 164 Dec 25 01:19 /home/oldboy/script/functions 401181 4 drwx------ 3 514 517 4096 Mar 4 18:02 /home/com 401182 4 -rw-r--r-- 1 514 517 176 Jul 24 2015 /home/com/.bash_profile 401183 4 drwxr-xr-x 4 514 517 4096 Mar 30 1978 /home/com/.mozilla 401184 4 drwxr-xr-x 2 514 517 4096 Aug 18 2010 /home/com/.mozilla/extensions 401185 4 drwxr-xr-x 2 514 517 4096 Aug 18 2010 /home/com/.mozilla/plugins 401186 4 -rw-r--r-- 1 514 517 124 Jul 24 2015 /home/com/.bashrc 401187 4 -rw-r--r-- 1 514 517 18 Jul 24 2015 /home/com/.bash_logout [root@oldboy ~]# find /home -nouser -o -nogroup /home/gentoo /home/gentoo/.bash_profile /home/gentoo/.bashrc /home/gentoo/.bash_logout /home/oldboy/.bash_profile /home/oldboy/.bashrc /home/oldboy/2.txt /home/oldboy/test /home/oldboy/.viminfo /home/oldboy/.bash_history /home/oldboy/.history /home/oldboy/.bash_logout /home/oldboy/script /home/oldboy/script/functions /home/com /home/com/.bash_profile /home/com/.mozilla /home/com/.mozilla/extensions /home/com/.mozilla/plugins /home/com/.bashrc /home/com/.bash_logout [root@oldboy ~]# find /home \( -nouser -o -nogroup \) -ls 394558 4 drwx------ 2 512 514 4096 Jan 17 10:54 /home/gentoo 394559 4 -rw-r--r-- 1 512 514 176 Jul 24 2015 /home/gentoo/.bash_profile 394560 4 -rw-r--r-- 1 512 514 124 Jul 24 2015 /home/gentoo/.bashrc 394561 4 -rw-r--r-- 1 512 514 18 Jul 24 2015 /home/gentoo/.bash_logout 394369 4 -rw-r--r-- 1 oldboy 500 176 Jul 24 2015 /home/oldboy/.bash_profile 394370 4 -rw-r--r-- 1 oldboy 500 124 Jul 24 2015 /home/oldboy/.bashrc 394565 0 -rw-rw-r-- 1 oldboy 500 0 Mar 3 1978 /home/oldboy/2.txt 394566 4 drw-r----- 2 oldboy 500 4096 Mar 3 1978 /home/oldboy/test 394375 4 -rw------- 1 oldboy 500 816 Dec 25 01:19 /home/oldboy/.viminfo 394373 4 -rw------- 1 oldboy 500 695 Mar 3 1978 /home/oldboy/.bash_history 394128 4 -rw------- 1 oldboy 500 17 Mar 30 1978 /home/oldboy/.history 394371 4 -rw-r--r-- 1 oldboy 500 18 Jul 24 2015 /home/oldboy/.bash_logout 394372 4 drwxrwxr-x 2 oldboy 500 4096 Dec 25 01:19 /home/oldboy/script 394374 4 -rw-rw-r-- 1 oldboy 500 164 Dec 25 01:19 /home/oldboy/script/functions 401181 4 drwx------ 3 514 517 4096 Mar 4 18:02 /home/com 401182 4 -rw-r--r-- 1 514 517 176 Jul 24 2015 /home/com/.bash_profile 401183 4 drwxr-xr-x 4 514 517 4096 Mar 30 1978 /home/com/.mozilla 401184 4 drwxr-xr-x 2 514 517 4096 Aug 18 2010 /home/com/.mozilla/extensions 401185 4 drwxr-xr-x 2 514 517 4096 Aug 18 2010 /home/com/.mozilla/plugins 401186 4 -rw-r--r-- 1 514 517 124 Jul 24 2015 /home/com/.bashrc 401187 4 -rw-r--r-- 1 514 517 18 Jul 24 2015 /home/com/.bash_logout
案例演示
找出/tmp目錄下,屬主不是root,並且文件的名字不是www的文件
find /tmp ! \( -user “root” -o -name “www” \) -ls
根據文件大小來查找
-size [+|-]num:指定文件的大小來進行查找。num表示文件的大小,后邊可以跟一個單位,單位包括k、m、g
使用注意:
①當我們給定數字和單位,那么去找尋文件時表示查詢的文件的大小范圍在大於這個給定數字減一到這個給定數字之間的任何值
②如果使減號后面跟數字加單位,表示找尋的文件大小是從0開始到給定數字減一的所有文件
③如果使用加號后面跟數字加單位,表示去找尋的文件是從當前給定數字到無窮大之間的所有文件的大小
使用案例
查找/tmp目錄下,大小是3k的文件
find /tmp -size 3k -type f
注意:這里打印出的文件可能並非大小只是3k的文件,包括大於2k,小於等於3k的文件
根據文件時間戳查找
以天為單位
-atime [+|-] num:查詢訪問時間
-mtime [+|-] num:查詢修改時間
-ctime [+|-] num:查詢文件屬性改變時間
一分鍾為單位
-amin [+|-] num:查詢訪問時間
-mmin [+|-] num:查詢修改時間
-cmin [+|-] num:查詢文件屬性改變時間
注意上面具體的時間參數在下面給出了
注意:
+num:表示指定天數大於等於num+1天之前
num:如果只是數字,沒有加減號,那么表示大於等於我們給定的前num這個天數,小於給定num天數加1
-num:從當前開始(即大於等於0)到前三天,但是不包括前第三天即小於num天數
圖示這些關系
![]()
|
|
根據文件權限來查找
-perm [-|/] MODE
MODE:沒有加號或者減號,表示精確權限匹配權限
MODE前給定了加號(/)或者減號( - )表示
/MODE:任何一類對象(u、g、o)的權限中只要有一個匹配即可。CentOS7.x中+號的MODE形式已經被廢棄了。改用的是斜線/
案例演示
找尋/tmp目錄下的所有文件的文件屬性在其他組的權限上具有執行權限的文件
find /tmp -perm /001 -ls
找尋/tmp目錄下的所有文件的文件屬性在屬組的權限上具有寫或者讀權限的文件
find /tmp -perm /060 -ls
-MODE:每一類對象(u、g、o)必須同時擁有為其制定的權限標准
案例演示
找尋/tmp目錄下所有文件的文件屬性在其他組的權限上具有可寫、可執行或者可讀、可寫、可執行的文件
find /tmp -perm -003 -ls
處理動作
-print:默認的處理動作,顯示到屏幕上
-ls:類似於對查詢到的文件執行ls -l命令
-delete:刪除查詢到的文件,謹慎使用
-fls FILE:查詢到的所有文件的長格式信息保存值指定的PATH文件中
-ok COMMAND {} \; :對查詢到的每個文件執行由COMMAND指定的命令。但是這個命令在對每個文件進行命令之前都會交互是的與用戶進行確認。注意:大括號與反斜線之間必須要有空格,否則報錯。相對安全
-exec COMMAND {} \; :對查詢到的每個文件執行由COMMAND指定的命令。但是這個不會跟用戶進行交互式確認。注意:大括號與反斜線之間必須要有空格,否則報錯。比較不安全
注意:花括號{ }的表示的是引用find查詢到的文件,而\;表示固定格式
使用案例
查詢/tmp目錄下三分鍾之前修改過的文件,並且將文件名改為以.new結尾

[root@oldboy ~]# find /tmp -type f -cmin -3 /tmp/fstab /tmp/issue [root@oldboy ~]# find /tmp -type f -cmin -3 -exec mv {} {}.new \; [root@oldboy ~]# find /tmp -type f -cmin -3 /tmp/fstab.new /tmp/issue.new
注意:find傳遞查詢到的文件傳遞給后面指定的命令時,是一次性查詢到所有符合條件的文件,並且一次性傳遞給后面的命令。這個時候要注意,有些命令不能接受過多的參數,因此可能造成溢出,此時命令可能就會執行失敗。那么怎么規避這個問題呢?使用xargs命令
find | xargs COMMAND
這條命令表示:通過find命令查詢到所有文件通過管道交給xargs,然后后面命令執行時,一次給命令一個參數,直至xargs給完所有內容
locate查找文件工具
非實時查找或者叫數據庫查找,他不是去遍歷文件系統上的所有文件,而是一開始將所有的文件做成一個索引存放在數據庫中,locate就是用來查詢數據庫而完成查找的
locate文件的查找依賴於事先構建的索引,索引的構建是在系統較為空閑時自動進行(這個是一個周期性任務)。
locate的查詢速度很快。因為他是通過數據庫索引進行查找的,但是他的查找不夠精確,因為,文件索引在數據庫中的構建需要系統自動進行,而且是在系統比較空閑時進行的,因此,當我們創建一個文件后,通過locate去查找,可能不會找到。但是我們可以手動更新數據庫
手動更新文件索引數據庫使用的命令updatedb。注意:文件索引的構建是非常消耗資源的,因為他要遍歷整個根文件系統。當系統比較繁忙時禁止使用這個命令,因為可能其他服務無法工作
工作特點
查找速度查找
模糊查找:路徑下出現某個關鍵詞都會把相應的路徑打印出來
非實時查找,非精確查找
locate基本語法
ocate keyword
使用介紹
locate就是根據keyword關鍵詞進行查找,她會找出包含keyword所有路徑
2、find的練習
查詢/var/目錄下屬主為root且屬組為mail的文件或者目錄
find /var/ -user “root” -a -group “mail”
查詢/usr下屬主不為root、bin、或者hadoop的所有文件或者目錄
find /usr -not \( -user root -o -user “bin” -o -user “hadoop” \)
find /usr -not -user root -a -not -user bin -a -not -user haddop
查詢當前系統上沒有屬主或者屬組且最近一周內曾被訪問過的文件或者目錄
find / -nouser -a -nogroup -a -atime -7
注意:問題的或者有不同的含義
查詢/etc/目錄下最近一周內其內容被修改過,同時屬主不為root,也不是hadoop的文件或者目錄
find /etc -not -mtime -7 -a -not \( -user root -o -user hadoop \)
find /etc -not \( -mtime -7 -o -user root -o -user hadoop \)
查詢/etc/目錄下大於1M且類型為普通文件的所有文件
find /etc -size +1m -type f
查詢/etc/所有用戶都沒有寫權限的文件
find /etc/ -not -perm /222
查詢/etc/下至少有一類用戶沒有執行權限的文件
find /etc/ -not -perm -111
查詢/etc/init.d/下,所有用戶都有執行權限且其他用戶有些權限的文件
find /etc/init.d/ -perm -113