find
在指定的目錄下查找文件,並可對找到的文件執行指定的操作。Find指定會從指定的目錄向下遞歸搜索各個子目錄。GNUf ind根據優先級規則從左到右計算給定表達式,從而搜索根植於每個給定文件名的目錄樹,直到找到結果,此時find移到下一個文件名。如果在安全很重要的環境中使用find(例如,如果您使用它搜索其他用戶可寫的目錄),則應閱讀findutils文檔中的“Security Considerations”一章。
此命令的適用范圍:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。
1、語法
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
2、選項列表
| 選項 |
說明 |
| -version | --version |
顯示命令版本信息 |
| -help | --help |
顯示幫助文檔 |
| -P |
找到符號鏈接的時候,所有的屬性都來自符號鏈接。這是默認選項 |
| -L |
找到符號鏈接的時候,所有的屬性來自文件本身,而不是符號鏈接 |
| -H |
找到符號鏈接的時候,所有的屬性都來自符號鏈接。 |
| -Ddebugoptions |
打印診斷信息;這可能有助於診斷問題,為什么查找不做您想做的事情。調試選項列表應以逗號分隔。可以有一下選項: help,解釋調試選項 tree,以其原始和優化的形式顯示表達式樹 stat,使用stat和lstat系統調用檢查作為文件的打印消息。find程序試圖將此類調用最小化。 opt,打印有關表達式樹優化的診斷信息;請參見-O選項。 rates,打印一個摘要,指示每個謂詞成功或失敗的頻率。 |
| -Olevel |
啟用查詢優化。Find程序重新排序測試以加快執行速度,同時保持總體效果;也就是說,具有副作用的謂詞不會相對於其他謂詞重新排序。在每個優化級別上執行的優化如下: 0,相當於優化級別1 1,這是默認的優化級別,與傳統行為相對應。表達式被重新排序,以便首先執行僅基於文件名(例如-name和-regex)的測試。 2,任何-type或-xtype的測試都是在只基於文件名的任何測試之后,而是在需要inode提供信息的任何測試之前執行的。在許多Unix的現代版本上,readdir()返回文件類型,因此這些謂詞比需要先統計文件的謂詞計算速度更快 3,在此優化級別上,啟用了完全基於成本的查詢優化器。對測試順序進行了修改,以便首先執行廉價(即快速)測試,並在必要時執行更昂貴的測試。在每個成本范圍內,謂詞將根據它們是否可能成功而更早或更晚地進行評估。對於-o,有可能成功的謂詞會更早地進行評估,而對於-a,可能會失敗的謂詞將更早地進行評估。 |
3、說明
-H,-L和-P選項控制符號鏈接的處,。后面的命令行參數被視為要檢查的文件或目錄的名稱,直到以‘-’或‘(’或‘!’開頭的第一個參數為止。該參數和隨后的任何參數都被視為描述要搜索的內容的表達式。如果沒有提供路徑,則使用當前目錄。如果沒有給出表達式,則使用表達式“-print”。
這些選項控制find的行為,但在上一個路徑名之后立即指定。五個“實”選項-H,-L,-P,-D和-O必須出現在第一個路徑名之前,如果有的話。“--”也可以用來表示任何剩余的參數都不是選項(但如果在起始點列表中使用通配符,則確保所有起始點都以“./”或“/”開頭通常更安全)。
如果指定了-H、-L和-P中的一個,最后一個出現在命令行上的操作將生效。由於-P選項是默認的,因此,除非指定了-H或-L,否則-P選項應視為有效。在命令行本身的處理過程中,在搜索開始之前,GNU經常查找stats文件。當-H或-L選項生效時,列出的任何作為-newer參數的符號鏈接將被取消引用,並且時間戳將從符號鏈接指向的文件中提取。同樣的考慮也適用於-newerxy,-anewer和-cnewer。
4、表達式
表達式由OPTION(這些選項影響整體操作而不是處理特定文件,並且始終返回true)、TEST(返回真或假值)和ACTION(有副作用並返回真或假值)組成,所有這些選項都由操作符‘-’分隔。如果表達式不包含“-prune”以外的操作,則對表達式為true的所有文件執行“-print”。
1)OPTION
所有選項總是返回true。除了-daystart、-follow和-regextype之外,這些選項會影響所有測試,包括在選項之前指定的測試。這是因為這些選項是在分析命令行時處理的,而測試在檢查文件之前不會執行任何操作。在這方面,-daystart、-follow和-regextype選項是不同的,並且只對稍后出現在命令行中的測試有影響。因此,為了清晰起見,最好將它們放在表達式的開頭。如果不這樣做,就會發出警告。
| 選項 |
說明 |
| -d |
depth的同義詞,與FreeBSD、NetBSD、MacOSX和OpenBSD兼容. |
| -daystart |
測量時間(用於-amin,-atime,-cmin,-ctime,-mmin和-mtime)從今天開始,而不是從24小時前開始。此選項僅影響稍后出現在命令行中的測試。 |
| -depth |
在目錄本身之前處理每個目錄的內容。 |
| -follow |
使用-L選項代替。解除引用符號鏈接。“follow”選項只影響在命令行中出現的測試。 |
| -help | --help |
打印出幫助信息,並且退出 |
| -ignore_readdir_race |
通常情況下,Find將在無法統計文件時發出錯誤消息。如果您提供了此選項,並且在find從目錄中讀取文件的名稱和它試圖統計該文件的時間之間刪除了一個文件,則不會發出錯誤消息。這也適用於命令行中給出其名稱的文件或目錄。此選項在讀取命令行時生效,這意味着您不能在打開此選項的情況下搜索文件系統的一個部分,並在關閉該選項時搜索其中的一部分(如果需要這樣做,則需要發出兩個find命令,一個帶有該選項,另一個沒有)。 |
| -maxdepth levels |
查找的最大深度,“-maxdepth 0”只對命令行出現的TEST和ACTION有效 |
| -mindepth levels |
不要在低於levels的級別上應用任何測試或操作,“-maxdepth 1”意味着處理除命令行參數以外的所有文件。 |
| -mount |
不要將目錄降到其他文件系統上。-xdev的替代名稱,用於與find的其他版本兼容。 |
| -noignore_readdir_race |
關閉-ignore_readdir_race. |
| -noleaf |
不要通過假設目錄包含的子目錄比硬鏈接數少兩個來進行優化。在搜索不遵循Unix目錄鏈接約定的文件系統(如CD-ROM或MS-DOS文件系統或AFS卷掛載點)時,需要此選項。普通Unix文件系統上的每個目錄至少有兩個硬鏈接:name和“.”。此外,它的子目錄(如果有的話)都有一個“.”鏈接到該目錄的條目。當find檢查一個目錄時,在它聲明了比目錄的鏈接數少兩個子目錄之后,它知道目錄中的其余條目是非目錄的(目錄樹中的“leaf”文件)。如果只需要檢查文件的名稱,就不需要對它們進行統計;這就大大提高了搜索速度。 |
| -regextype type |
更改命令行后面發生的-regex和-iregex測試所理解的正則表達式語法。 |
| -version, --version |
打印find命令的版本信息,並且退出 |
| -warn, -nowarn |
關閉或者打開警告信息 |
| -xautofs |
不要降低autofs文件系統上的目錄 |
| -xdev |
不要降低其他文件系統上的目錄 |
2)TEST
有些測試,例如newerXY和-samefile,允許比較當前正在檢查的文件和命令行上指定的引用文件。當使用這些測試時,引用文件的解釋由選項H、-L和-P以及前面的任何選項決定,但是在解析命令行時,只檢查一次引用文件。如果無法檢查引用文件(例如,stat(2)系統調用失敗),則會發出錯誤消息,並查以非0狀態退出。
| 選項 |
說明 |
| +n |
大於n |
| -n |
小於n |
| n |
n |
| -amin m |
查找m分鍾之前被訪問過的文件 |
| -anewer file |
最近被訪問的文件,而不是最近被修改的文件 |
| -atime m |
最近m天前被訪問的文件 |
| -cmin m |
查找m分鍾之前被修改過文件狀態的文件 |
| -cnewer file |
最近被未改過文件狀態的文件,而不是最近被修改的文件 |
| -ctime m |
最近m天前被修改文件狀態的文件 |
| -mmin m |
查找最近m分鍾前被修改過內容的文件 |
| -mtime m |
查找最近m天前被修改過內容的文件 |
| -empty |
查找大小為0的目錄和文件 |
| -executable |
查找可以被執行的文件,或者可以被搜索的目錄 |
| -fstype type |
查找在指定文件系統上的文件 |
| -gid id |
查找屬於指定組id的文件 |
| -group name |
查找屬於指定組的文件 |
| -ilnamepattern |
和“-lname”一樣,但匹配是不區分大小寫的。如果-L選項或-follow選項生效,則除非符號鏈接中斷,否則此測試返回false。 |
| -iname pattern |
和“-name”一樣,但匹配是不區分大小寫的 |
| -inum n |
文件inode編號n。通常情況下,使用-samefile測試更容易。 |
| -ipath pattern |
和“-iwholename”一樣,不建議使用 |
| -iregex pattern |
和“-regex”一樣,但是匹配不區分大小寫 |
| -iwholenamepattern |
和“-wholename”一樣,但是匹配不區分大小寫 |
| -links n |
有n個鏈接的文件 |
| -lnamepattern |
找找符合指定匹配模式的符號鏈接文件 |
| -name pattern |
文件名的基(刪除了前導目錄的路徑)與shell模式匹配。元字符(“*”、“?”和“[]”)與“.”匹配。 |
| -newer file |
比file更近修改的文件 |
| -newerXYreference |
將當前文件的時間戳與引用進行比較。引用參數通常是文件的名稱(其中一個時間戳用於比較),但也可能是描述絕對時間的字符串。X和Y是其他字母的占位符,這些字母選擇屬於如何使用引用進行比較的時間。 a,文件的訪問時間。 B,文件的產生時間 c,文件inode狀態改變的時間 m,文件的修改時間 t,引用被直接解釋為時間。 |
| -nogroup |
沒有組對應於文件的組ID |
| -nouser |
沒有用戶對應於文件的用戶ID。 |
| -path pattern |
文件名與shell模式匹配。元字符不處理“/”或‘.’,例如“find . -path ’./sr*sc‘”為名為“./src/misc”的目錄打印一個條目。若要忽略整個目錄樹,請使用-prune而不是檢查樹中的每個文件。例如,要跳過目錄“src/emacs”及其下的所有文件和目錄,並打印找到的其他文件的名稱,請執行如下操作“find . -path ./src/emacs -prune -o –print” |
| -perm –mode |
為文件設置了所有權限位模式。符號模式以這種形式被接受,這通常是想要使用它們的方式。如果使用符號模式,則必須指定“u”、“g”或“o” |
| -perm /mode |
為該文件設置任何權限位模式。符號模式以這種形式被接受。如果使用符號模式,則必須指定“u”、“g”或“o”。有關一些說明性示例,請參見示例部分。如果沒有在模式中設置權限位,此測試將匹配任何文件(這里的想法是與-perm-000的行為一致)。 |
| -perm+mode |
不推薦使用這種模式集中任何權限位搜索文件的舊方法。你應該改用“-perm /mode”。例如,‘+u+x’是一個有效的符號模式(等效於+u,+x,即0111)。 |
| -size n[cwbkMG] |
查找指定大小的文件。文件單位默認是塊,512字節。有以下單位: ‘b’,521字節的塊,默認 ‘c’,bytes ‘w’,2個字節 ‘k’,1024字節 ‘M’,1048576字節 ‘G’,1073741824字節 |
| -type 類型 |
查找指定類型的文件。c,字符設備;d,目錄文件;p,有名管道;f,普通文件;l,符號鏈接;s,socket文件 |
| -uid n |
指定文件的uid |
| -used n |
最后一次訪問文件是在最后一次更改狀態后的n天。 |
| -user name |
查找屬於指定用戶的文件 |
| -wholenamepattern |
等價於“-path” |
| -writable |
匹配可寫的文件。 |
| -xtype c |
和“-type”相同,除非文件是符號鏈接。對於符號鏈接,-xtype檢查-type不檢查的文件的類型。 |
| -contextpattern |
文件的安全上下文與GLOB模式相匹配。 |
3)ACTIONS
| 選項 |
說明 |
| -delete |
刪除文件;如果刪除成功,則為true。如果刪除失敗,則發出錯誤消息。如果“-delete”失敗,find的退出狀態將為非零 |
| -execcommand |
執行命令;如果返回0狀態,則為true。以下所有要查找的參數都被視為命令的參數,直到遇到由‘;’組成的參數為止。字符串“{}”被當前文件名替換,當前文件名在命令的參數中出現在任何地方,而不僅僅是在只有它的參數中,就像在find的某些版本中那樣。這兩個構造可能都需要轉義(用‘\’)或引用,以保護它們不受外殼的擴展。有關使用-exec選項的示例,請參閱示例部分。指定的命令對每個匹配的文件運行一次。該命令在啟動目錄中執行。在使用-exec操作時存在不可避免的安全問題;您應該使用-execdir選項。 |
| -execcommand{} + |
-exec操作的這個變體在選定的文件上運行指定的命令,但是命令行是通過在末尾追加每個選定的文件名來構建的;命令的調用總數將比匹配的文件數少得多。命令行的構建方式與xargs構建其命令行的方式大致相同。命令中只允許“{}”的一個實例。命令在起始目錄中執行。 |
| -execdircommand; -execdircommand{} + |
類似-exec,但指定的命令是從包含匹配文件的子目錄運行的,該子目錄通常不是您開始查找的目錄。 |
| -fls file |
真,類似“-ls”,但是寫文件類似“-fprint”。輸出文件總是被創建,即使謂詞永遠不匹配。 |
| -fprint file |
真,將完整的文件名打印到文件中。如果運行find時文件不存在,則創建文件;如果文件存在,則截斷文件。文件名‘/dev/stdout’和‘/dev/stderr’是專門處理的;它們分別引用標准輸出和標准錯誤輸出。輸出文件總是被創建,即使謂詞永遠不匹配 |
| -fprint0 file |
真,類似“-print0”,但是寫文件類似“-fprint”。輸出文件總是被創建,即使謂詞永遠不匹配。 |
| -fprintf file format |
真,類似“-printf”但是寫到文件類似“-fprint”。輸出文件總是被創建,即使謂詞永遠不匹配。 |
| -ls |
真,在標准輸出上以“ls -dils”格式列出當前文件。塊計數為1K塊,除非設置了環境變量POSIXLY_TRIDER,在這種情況下使用了512字節塊。 |
| -ok command; |
類似“-exec”,但是先問用戶。如果用戶同意,運行命令。否則只會返回FALSE。如果運行該命令,它的標准輸入將從/dev/null重定向。 |
| -okdircommand; |
類似“-execdir”,但是和“-ok”一樣先詢問用戶。如果用戶不同意,只需返回false。如果運行該命令,它的標准輸入將從/dev/null重定向。 |
| |
真,在標准輸出上打印完整的文件名,然后是換行符。 |
| -print0 |
真,在標准輸出上打印完整的文件名,然后是空字符 |
| -printf format |
真,在標准輸出上打印格式,解釋‘\’轉義和‘%’指令。字段寬度和精度可以用“printf C“函數指定。請注意,許多字段是以%s而不是%d的形式打印的。與-print不同,-printf不會在字符串末尾添加換行符。 |
| -prune |
如果該文件是一個目錄,則不要下降到它 |
| -quit |
馬上退出。不會繼續運行子進程,但不會處理命令行上指定的路徑。 |
4)操作符,按優先次序排列
| 選項 |
說明 |
| ( expr ) |
強制優先 |
| ! expr |
取反 |
| -not expr |
取反,但不適合POSIX |
| expr1 expr2 |
隱含的“與“操作 |
| expr1 -a expr2 |
和“expr1 expr2“一樣 |
| expr1 -and expr2 |
和“expr1 expr2“一樣,但是不適合POSIX |
| expr1 -o expr2 |
“或“操作 |
| expr1 -or expr2 |
“或“操作,不適合POSIX |
| expr1 , expr2 |
始終對expr1和expr2進行計算。expr1的值被丟棄;列表的值是expr2的值。逗號運算符對於搜索幾種不同類型的東西很有用,但是只遍歷文件系統層次結構一次 |
5、環境變量
LANG,為未設置或空的全局變量提供默認值。
LC_ALL,如果設置為非空字符串值,則重寫所有其他全局變量的值。
LC_COLLATE,POSIX標准指定此變量影響用於-name選項的模式匹配。對‘LC_COLLATE’的支持取決於系統庫。這個變量還會影響對“-ok“的響應的解釋;當‘LC_MESSAGES’變量選擇用於將響應解釋為”-ok“的實際模式時,模式中任何括號表達式的解釋都會受到‘LC_COLLATE’的影響。
LC_CTYPE,如果系統的fnmatch (3)庫函數支持該變量,則此變量將影響正則表達式中使用的字符類的處理以及名稱測試。此變量還會影響用於解釋“-ok“發出的提示的響應的正則表達式中任何字符類的解釋。當打印文件名時,‘LC_CTYPE’環境變量還將影響哪些字符被認為是不可打印的;
LC_MESSAGES,確定要用於全局消息的區域設置。如果設置了‘POSIXLY_RETERT’環境變量,這還將確定對“-ok“操作所作提示的響應的解釋
NLSPATH,確定全局信息目錄的位置。
PATH,影響搜索以查找-exec、-execdir、-ok和-okdir調用的可執行文件的目錄。
POSIXLY_CORRECT,確定-ls和-fls使用的塊大小。如果設置了POSIXLY_RIDERT,則塊是512字節的單位。否則,它們是1024字節的單位。
TZ,影響用於-printf和-fprintf的一些與時間相關的格式指令的時區。
6、返回值
如果成功,返回0;如果失敗,返回大於0的數。
7、例子程序
| find /tmp -name core -type f -print | xargs /bin/rm -f |
在/tmp目錄中或下面查找名為core的文件並刪除它們。請注意,如果存在包含換行符、單引號或雙引號或空格的文件名,則此操作將不正確。
| find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f |
在目錄/tmp中或下面查找名為core的文件,並刪除它們,處理文件名,以便正確處理包含單引號或雙引號、空格或換行符的文件或目錄名稱。名稱測試出現在-type測試之前,以避免對每個文件調用stat(2)。
| find . –type f -exec file '{}' \; |
對當前目錄中或當前目錄下的每個文件運行“file”。注意,大括號被用單引號括起來,以保護它們不被解釋為shell腳本標點符號。分號同樣受到反斜杠的保護,盡管在這種情況下也可以使用單引號。
| find / \( -perm -4000 -fprintf /root/suid.txt '%#m %u %p\n' \) , \( -size +100M -fprintf /root/big.txt '%-10s %p\n' \) |
只遍歷文件系統一次,將setuid文件和目錄列出到/root/suid.txt,並將大型文件列出到/root/big.txt
| find $HOME -mtime 0 |
在您的主目錄中搜索在過去24小時內已經修改的文件。此命令的工作方式是這樣的,因為每個文件上次修改后的時間被除以24小時,其余部分被丟棄。這意味着要匹配-mtime 0,文件必須在過去進行修改,而修改時間不到24小時前。
| find /sbin /usr/sbin -executable \! -readable –print |
搜索可執行但不可讀的文件
| find . –perm 664 |
搜索所有者和組有讀寫權限,但其他用戶可以讀取但不能寫入的文件。滿足這些條件但設置了其他權限的文件(例如,如果有人可以執行該文件)將不匹配。
| find . -perm -664 |
搜索所有者和組有讀寫權限的文件,以及其他用戶可以讀取的文件,而不考慮是否存在任何額外的權限位(例如可執行位)。例如,這將匹配具有模式0777的文件。
| find . –perm /222 |
搜索可寫的文件
| find . -perm /220 find . –perm /u+w,g+w find . -perm /u=w,g=w |
所有這三個命令都執行相同的操作,但是第一個命令使用文件模式的八進制表示,另外兩個命令使用符號形式。這些命令都搜索其所有者或組可寫的文件。文件不必由所有者和組同時寫入才能匹配,兩者都可以。
| find . –perm -220 find . -perm -g+w,u+w |
這兩個命令執行相同的操作;搜索它們的所有者和組都可以寫的文件。
| find . -perm -444 -perm /222 ! -perm /111 find . –perm -a+r -perm /a+w ! -perm /a+x |
這兩個命令都搜索每個人都可讀的文件(-perm -444或-perm -a+r),至少設置了一個寫入位集(-perm /222或-perm /a+w),但任何人都不能執行(!-perm /111和!-perm /a+x)。
| cd /source-dir find . -name .snapshot -prune -o \( \! -name *~ -print0 \)| cpio -pmd0 /dest-dir |
此命令將/source-dir的內容復制到/dest-dir,但省略了名為“.snapshot “的文件和目錄(以及其中的任何內容)。它還省略了名稱以~結尾的文件或目錄,而不是其內容。
| find repo/ -exec test -d {}/.svn -o -d {}/.git -o -d {}/CVS ; -print –prune |
給定以下項目目錄及其相關的SCM管理目錄,高效地搜索項目的根
repo/project1/CVS
repo/gnu/project2/.svn
repo/gnu/project3/.svn
repo/gnu/project3/src/.svn
repo/project4/.git
8、實例演示
1)在根目錄下查找doc后綴的文件
|
|
2)將查找到的內容輸出到res.txt
|
|
3)查找屬於指定用戶的文件
|
|
