find命令是各種Linux發現版中比較重要的、常用的一個命令,該命令功能強大,熟練掌握了這個命令的使用,對平時的系統運維、管理工作會起到事半功倍的效果。
一.獲取幫助信息
[root@root@GeekDevOps-find ~]# find --help[root@root@GeekDevOps-find ~]# man find
大家會發現幫助信息很多,但是不太好理解。
二.find命令的格式
通過find的在線幫助文檔,我們可以知道,find命令的使用格式為:
find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
我們將[path…]之前平時很少使用的部分歸為一類,簡稱為:option,。如此,該命令的格式即可表示為:
find [option] [PATH] [expression]
其中,』-H』 『-L』 『-P』三個選項主要是用於處理符號連接。』-H』表示除了處理命令行參數之外,不跟隨其他符號連結,也就是說只跟隨命令行中指定的符號連接,』-L』表示跟隨所有的符號連接,』-P』是默認的選項,表示從不跟隨符號連接。
[-D debugoptions]主要用於列印診斷信息。能幫助我們診斷出find命令為何不執行我們想要其執行的任務。我們來大致了解一下:
[root@GeekDevOps-find system]# find -D helpValid arguments for -D:help Explain the various -D optionstree Display the expression treesearch Navigate the directory tree verboselystat Trace calls to stat(2) and lstat(2)rates Indicate how often each predicate succeededopt Show diagnostic information relating to optimisationexec Show diagnostic information relating to -exec, -execdir, -ok and -okdir
[-Olevel]:啟用查詢優化。一共有從0-3四個優化級別。其中0和1級別是等價的,系統默認值為1,這個選項需要在O後面直接跟一個表示查詢優化的十進位數字,如O2。
以上部分均來自於find在線幫助文檔,本人僅進行了翻譯、收集、整理工作,由於這一部分內容平時均使用的是默認值,其他值很少用到,點到為止,不作深入探討。
下面讓我們具體舉一個例子來討論一下find命令的格式。
[root@GeekDevOps-find system]# find /bin /etc -name shadow /etc/shadow
由於[option]部分使用的默認值,因此命令後直接跟的是[PATH]部分的內容,在上面的例子中,PATH的值為/bin和/etc,即需要查找的文件或目錄的路徑,可以是絕對路徑,也可以是相對路徑,可以跟多個。
[expression]後跟的是需要查找的表達式。例子中用的是-name shadow這個表達式,指定條件為找到文件名是shadow的文件。這是find命令的核心內容,是需要我們重點學習的部分。表達式指定了我們要查找的是什麼屬性的文件。此外,表達式還可以指定一些操作,比如刪除某些條件匹配的文件或內容。
三.表達式
由於關於find的在線手冊有1100多行之多,非常詳細,要一一做介紹的話需要花很多時間。因此,我選擇性的選取在日常工作中常用的知識點進行學習。
(一)TESTS
find命令是通過文件屬性查找文件的。find表達式的tests都是文件的屬性條件,比如文件的各種時間,文件權限等。很多參數中會出現指定一個數字n,一般會出現以下三種寫法:
+n:表示大於n。
-n:表示小於n。
n:表示等於n。
(二)按照時間進行查找
-amin:以分鐘為單位通過文件的最後存取時間(access time)查找文件。
-cmin:以分鐘為單位通過文件的狀態修改時間(change time)查找文件。
-mmin:以分鐘為單位通過文件的數據修改時間(modify time)查找文件。
-atime:以天為單位通過文件的最後存取時間(access time)查找文件。
-ctime:以天為單位通過文件的狀態修改時間(change time)查找文件。
-mtime:以天為單位通過文件的數據修改時間(change time)查找文件。
-newer:查找比當前文件數據修改時間更加新一點的另外的文件。
-anewer:查找比當前文件的最後存取時間更加新一點的另外的文件。
-cnewer:查找比當前文件的狀態時間更加新一點的另外的文件。
現在的時間是16:55:
圖1
圖2
圖3
-newer還有一種特殊用法,可以用來做各種時間之間的比較。比如,我想找到文件修改時間比/etc/passwd文件的change time更新的文件:
[root@GeekDevOps-find ~]# find /etc/ -newermc /etc/shadow
這個用法的原型是:find /etc/ -newerXY file。其中Y表示的是跟後面file的什麼時間比較,而X表示使用查找文件什麼時間進行比較。-newermc就是拿文件的modify time時間跟file的change time進行比較。X和Y可以使用的字母為:
a:文件access time。
c:文件change time。
m:文件modify time。
(三)根據用戶、組查找
-uid n:文件的所屬用戶uid為n。
-user name:文件的所屬用戶為name。
-gid n:文件的所屬組gid為n。
-group name:所屬組為name的文件。
-nogroup:沒有所屬組的文件。
-nouser:沒有所屬用戶的文件。
[GeekDevOps@GeekDevOps-find /]$ find / -uid `id -u`.../home/GeekDevOps/home/GeekDevOps/.bash_logout/home/GeekDevOps/.bash_profile/home/GeekDevOps/.bashrc
(四)根據權限查找
-executable:文件可執行。
-readable:文件可讀。
-writable:文件可寫。
[GeekDevOps@GeekDevOps-find /]$ find / -writable #顯示內容過多,不列舉
-perm mode:查找權限為mode的文件,mode的寫法可以是數字,也可以是ugo的方式如:
[GeekDevOps@GeekDevOps-find /]$ find /home/ -perm 700 -ls534195 0 drwx------ 2 GeekDevOps GeekDevOps 62 1月 23 17:09 /home/GeekDevOps
這個寫法的等效寫法為:
[GeekDevOps@GeekDevOps-find /]$ find /home/ -perm u=rwx -ls534195 0 drwx------ 2 GeekDevOps GeekDevOps 62 1月 23 17:09 /home/GeekDevOps
另外要注意,mode指定的是完全符合這個權限的文件。
mode還可以使用/或-作為前綴進行描述。如果指定了-mode,就表示沒指定的權限是忽略的,就是說,權限中只要包涵相關權限即可。如:
[GeekDevOps@GeekDevOps-find /]$ find /home/ -perm 644 -ls534196 4 -rw-r--r-- 1 GeekDevOps GeekDevOps 18 8月 3 05:11 /home/GeekDevOps/.bash_logout534197 4 -rw-r--r-- 1 GeekDevOps GeekDevOps 193 8月 3 05:11 /home/GeekDevOps/.bash_profile534198 4 -rw-r--r-- 1 GeekDevOps GeekDevOps 231 8月 3 05:11 /home/GeekDevOps/.bashrc
[GeekDevOps@GeekDevOps-find /]$ find /home/ -perm -600 -ls16803401 0 drwxr-xr-x 3 root root 24 1月 23 17:09 /home/534195 0 drwx------ 2 GeekDevOps GeekDevOps 62 1月 23 17:09 /home/GeekDevOps534196 4 -rw-r--r-- 1 GeekDevOps GeekDevOps 18 8月 3 05:11 /home/GeekDevOps/.bash_logout534197 4 -rw-r--r-- 1 GeekDevOps GeekDevOps 193 8月 3 05:11 /home/GeekDevOps/.bash_profile534198 4 -rw-r--r-- 1 GeekDevOps GeekDevOps 231 8月 3 05:11 /home/GeekDevOps/.bashrc
以上代碼塊中,前面一個代碼塊找到所有只有644權限的文件,後面一個代碼塊-600就表示只要是包括了rw的其他位任意的文件。mode加/前綴表示的是,指定的權限只要某一位複合條件就可以,其他位跟-一樣忽略,就是說-perm /600還可以找到400或者600這樣權限的文件。目前CentOS7前綴+已經被棄用。
find命令內容較豐富,本人將分上中下三部分進行總結,分享,其他部分將在後續陸續更新,敬請期待,為了有更好的代碼閱讀體驗,您也可以關注的CSDN(GeekDevOps)。