使用Linux和Unix命令:find

LinuxUnix命令find查找目錄層次結構中的文件。

find命令的語法:

找到[path ...] [expression]

描述

本手冊頁記錄了GNU版本的find 。 根據優先級規則(請參見下面的運算符一節),通過評估給定表達式,從左到右評估給定表達式,直到結果已知;命令find查找以每個給定文件名為根的目錄樹; 換句話說,左邊是虛假的操作,真正的, 或者 ,在這一點上找到移動到下一個文件名。

第一個參數開始於:

被認為是表達的開始; 它之前的任何參數都是搜索的路徑,其後的任何參數都是表達式的其餘部分。 如果沒有給出路徑,則使用當前目錄。 如果沒有給出表達式,則使用表達式-print

如果所有文件都成功處理,則find命令將退出狀態0,如果發生錯誤,則該命令將大於0。

表達式

表達式由選項(影響整體操作而不是特定文件的處理,總是返回true),測試(返回true或false值)和動作(具有副作用並返回true或虛假值),全部由運營商分隔。 表達式-並假定在省略操作符的地方。 如果表達式不包含除-prune之外的其他操作,則在所有表達式為true的文件上執行-print

選項

所有選項總是返回true。 它們總是起作用,而不是只有在達到表達式的位置時才被處理。 因此,為了清楚起見,最好將它們放在表達式的開頭。

-daystart 從今天開始測量時間(對於-amin,-atime,-cmin,-ctime,-mmin-mtime ),而不是從24小時前開始。
-深度 在目錄本身之前處理每個目錄的內容。
-跟隨 取消引用符號鏈接。 意味著-noleaf
幫助或 - 幫助 打印查找和退出命令行使用情況的摘要。
-maxdepth [數字] 在命令行參數下面的目錄下降最多級別(非負整數)。 表達式-maxdepth 0表示僅將測試和操作應用於命令行參數。
-mindepth [數字] 不要在小於數字的級別上應用任何測試或操作(非負整數)。 表達式-mindepth 1表示處理除命令行參數以外的所有文件。
-安裝 不要下載其他文件系統上的目錄。 -xdev的替代名稱,用於與某些其他版本的查找兼容。
-noleaf 不要通過假設目錄包含少於2個子目錄來優化它們的硬鏈接數。*
- 版本或 - 版本 打印查找版本號並退出。
-xdev 不要下載其他文件系統上的目錄。

*在搜索不遵循Unix目錄鏈接約定的文件系統時需要此選項,例如CD-ROM或MS-DOS文件系統或AFS卷裝入點。 普通Unix文件系統上的每個目錄至少有2個硬鏈接:它的名字和它的名字 (期間)條目。 另外,它的子目錄(如果有的話)每個都有一個鏈接到該目錄的..條目。

find檢查一個目錄時,在目錄的鏈接數量減少了兩個以下的子目錄之後,它知道該目錄中的其餘條目是非目錄(目錄樹中的文件)。 如果只需要檢查文件的名稱,則不需要對它們進行統計; 這會顯著提高搜索速度。

測試

數字參數可以指定為:

+ N 對於大於n。
-n 少於n。
ñ 正好n。
-amin n 文件上次訪問時間為n分鐘前。
-anewer [文件] 最近訪問的文件文件被修改的時間更晚。 -anewer只有在以下情況下才會受到影響 - 關注之前 - 在命令行上執行。
-atime n 文件上次訪問n * 24小時前。
-cmin n 文件的狀態在n分鐘前最後更改。
-cnewer [文件] 文件的狀態最近更改的時間比文件被修改的時間更晚。
- cnewer僅受以下影響 - 如果以下情況發生在命令行上的-cnewer之前。
時間 文件的狀態在n * 24小時前最後更改。
-empty 文件是空的,可以是普通文件或目錄。
-假 總是假的。
-fstype [類型] 文件位於指定類型的文件系統上。 有效的文件系統類型在不同版本的Unix中有所不同; 在某些版本的Unix或另一版本上接受的不完整的文件系統類型列表是:ufs,4.2,4.3,nfs,tmp,mfs,S51K,S52K。 您可以使用帶有%F指令的-printf來查看文件系統的類型。
-gid n 文件的數字組ID是n
-group [gname] 文件屬於組gname(允許的數字組ID)。
-ilname [pattern] 和-lname一樣,但匹配不區分大小寫。
-iname [模式] 名字一樣,但匹配不區分大小寫。 例如,模式fo *F? 匹配文件名稱FooFOOfoofOo等。
-inum n 文件具有inode編號n
-ipath [模式] -path ,但匹配不區分大小寫。
-iregex [模式] 像-regex一樣,但匹配不區分大小寫。
鏈接 文件有n個鏈接。
-lname [模式] 文件是其內容與shell模式匹配的符號鏈接。 元字符不處理/ 特別。
-mmin n 文件數據是在n分鐘前最後修改的。
-mtime n 文件數據最近在n * 24小時前進行了修改。
-name [pattern] 文件名稱的基礎(刪除主導目錄的路徑)與shell模式匹配。 元字符( * ,?和[] )與a不匹配 在基地名稱的開始處。 要忽略目錄及其下的文件,請使用-prune ; 請參閱-path的描述中的示例。
- 更新[文件] 文件比文件更新 。 表達式-newer受以下影響 -只有在命令行中的“之後” 出現在“之前”時才會跟隨
-nouser 沒有用戶對應於文件的數字用戶ID。
-nogroup 沒有組對應於文件的數字組ID。
-path [pattern] 文件名與shell模式匹配。 元字符不處理/ 特別; 所以,例如,找到。 -path'./sr*sc將打印一個名為./src/misc(如果存在)的目錄條目。 要忽略整個目錄樹,請使用-prune而不是檢查樹中的每個文件。 例如,要跳過目錄src / emacs及其下的所有文件和目錄,並打印找到的其他文件的名稱,請執行以下操作:find。 -path'./src/emacs'-prune -o -print
-perm [模式] 文件的權限位完全是[模式] (八進製或符號)。 符號模式使用模式0作為出發點。
-perm -mode 所有權限位[模式]均為該文件設置。
-perm +模式 為該文件設置任何權限位[mode]
-regex [模式] 文件名稱匹配正則表達式模式 。 這是整個路徑上的匹配,而不是搜索。 例如,要匹配名為./fubar3的文件,可以使用正則表達式。* bar。。* b。* 3 ,但不是b。* r3
-size n [bckw] 文件使用n個單位的空間。 默認情況下,這些單元是512字節塊,或者如果b遵循n ,則字節如果c遵循n ,則如果k遵循n ,則為千字節;如果w遵循n,則為2字節字。 大小不計算間接塊,但它確實計算實際未分配的稀疏文件中的塊。
-真正 總是如此。
型c 文件是c類型的:
b 塊(緩衝)特殊
C 字符(無緩衝)特殊
d 目錄
p 命名管道(FIFO)
F 普通文件
符號鏈接
小號 插座
d 門(Solaris)
-uid n 文件的數字用戶ID是n
用過的 文件上次更改狀態後最近一次訪問。
用戶uname 文件由用戶uname擁有(允許使用數字用戶ID)。
-xtype c -type相同,除非該文件是符號鏈接。 對於符號鏈接:如果沒有給出-follow ,則如果該文件是指向類型為c的文件的鏈接,則為true; 如果已經給出 - 如果c是1,則返回true。 換句話說,對於符號鏈接,
-xtype檢查-type不檢查的文件的類型

操作

-exec 命令 ;

執行命令 ; 如果返回0狀態,則返回true。 以下所有找到的參數都被認為是該命令的參數,直到由“;”組成的參數 遇到。 在某些版本的find中 ,字符串“{}”被替換為當前文件名,該文件名在處理它的命令的參數中進行處理,而不僅僅是單獨存在的參數。 這兩個構造都可能需要被轉義(用'\')或引號來保護它們免受shell的擴展。 該命令在起始目錄中執行。

-fls 文件

真正; 像-ls,但寫入文件如-fprint。

-fprint 文件

真正; 將完整的文件名打印到文件文件中 。 如果運行查找文件不存在,則會創建它; 如果它確實存在,它將被截斷。 文件名“/ dev / stdout”和“/ dev / stderr”是專門處理的; 它們分別指標準輸出和標準錯誤輸出。

-fprint0 文件

真正; 像-print0但寫入文件如-fprint。

-fprintf 文件 格式

真正; 像-printf,但寫入文件如-fprint。

-ok 命令 ;

像-exec一樣,但首先詢問用戶(在標準輸入上); 如果響應不是以“y”或“Y”開始,請不要運行該命令,並返回false。

-打印

真正; 在標準輸出上打印完整的文件名,然後換行。

-print0

真正; 在標準輸出上打印完整文件名,後跟一個空字符。 這允許包含換行符的文件名由處理查找輸出的程序正確解釋。

-printf 格式

真正; 在標準輸出上打印格式 ,解釋'\'轉義和'%'指令。 字段寬度和精度可以用`printf'C函數來指定。 與-print不同,-printf不會在字符串的末尾添加換行符。 逃逸和指示是:

\一個

警鐘。

\ b

Backspace鍵。

\C

立即停止從此格式進行打印並清空輸出。

\F

換頁。

\ n

新隊。

\ r

回車。

\ t

水平標籤。

符\ v

垂直選項卡。

\\

一個文字反斜杠('\')。

\ NNN

ASCII碼為NNN(八進制)的字符。

一個'\'字符後跟任何其他字符被視為普通字符,因此它們都被打印出來。

%%

字面百分號。

%一個

文件的上次訪問時間採用C`ctime'函數返回的格式。

%A k

文件的上次訪問時間,格式為k ,既可以是`@',也可以是C`strftime'函數的指令。 下面列出了k的可能值。 由於系統之間`strftime'的差異,其中一些可能不適用於所有系統。

@

自1970年1月1日00:00 GMT以來的秒數。

時間字段:

H

小時(00..23)

一世

小時(01..12)

ķ

小時(0..23)

小時(1..12)

中號

分鐘(00..59)

p

現場的AM或PM

[R

時間,12小時(hh:mm:ss [AP] M)

小號

第二(00..61)

Ť

時間,24小時(hh:mm:ss)

X

區域設置的時間表示(H:M:S)

ž

時區(例如EDT),或者如果沒有時區是可確定的,則什麼都不是

日期字段:

一個

locale的縮寫週日名稱(Sun..Sat)

一個

語言環境的完整星期幾名稱,可變長度(星期日..星期二)

b

locale的縮寫月份名稱(Jan..Dec)

區域設置的全月名稱,可變長度(1月... 12月)

C

語言環境的日期和時間(Sat Nov 04 12:02:33 EST 1989)

d

(01..31)

d

日期(年/月/日)

H

與b相同

Ĵ

(001..366)

月(01..12)

ü

星期日的星期數作為星期的第一天(00..53)

w ^

星期幾(0..6)

w ^

週一到週的第一天(00..53)

X

區域設置的日期表示(mm / dd / yy)

ÿ

年份的後兩位數字(00..99)

ÿ

年(1970 ...)

%b

文件大小為512字節塊(向上舍入)。

%C

文件的最後狀態以C`ctime'函數返回的格式更改時間。

%C k

文件的上一次狀態更改時間的格式為k ,與%A相同。

%d

文件在目錄樹中的深度; 0表示該文件是命令行參數。

%F

刪除任何主要目錄的文件名(僅限最後一個元素)。

%F

文件所在文件系統的類型; 這個值可以用於-fstype。

%G

文件的組名稱或數字組ID,如果該組沒有名稱。

%G

文件的數字組ID。

%H

文件名的前導目錄(除最後一個元素外)。

%H

在其下找到文件的命令行參數。

%一世

文件的inode編號(十進制)。

%K

文件大小為1K塊(向上取整)。

%L

符號鏈接對象(如果文件不是符號鏈接,則為空字符串)。

%M

文件的權限位(八進制)。

%N

硬鏈接到文件的數量。

%p

文件的名稱。

%P

文件的名稱與命令行參數的名稱一起被刪除。

%S

文件大小以字節為單位。

%T

文件的最後修改時間採用C`ctime'函數返回的格式。

%T k

文件的上次修改時間的格式為k ,與%A相同。

%u

文件的用戶名或數字用戶標識(如果用戶沒有名稱)。

%U

文件的數字用戶ID。

一個'%'字符後跟任何其他字符將被丟棄(但另一個字符被打印)。

-修剪

如果沒有給出深度,則為真; 不要下載當前目錄。
如果給出了-depth,則為false; 沒有效果。

-ls

真正; 在標準輸出上以`ls -dils'格式列出當前文件。 塊計數為1K塊,除非設置了環境變量POSIXLY_CORRECT,在這種情況下使用512字節的塊。

運營商

按遞減優先順序列出:

expr

強制優先。

EXPR

如果expr為false,則為true。

不是expr

與...一樣 ! expr

expr1 expr2

和(暗示); 如果expr1為假,則不評估expr2

expr1 -a expr2

expr1 expr2相同。

expr1expr2

expr1 expr2相同。

expr1 -o expr2

要么; 如果expr1為true,則不評估expr2

expr1 - 或expr2

expr1 -o expr2相同。

expr1expr2

清單; 總是評估expr1expr2expr1的值被丟棄; 列表的值是expr2的值。

例子

找到/ home -user joe

找到用戶joe擁有的/ home目錄下的每個文件。

找到/ usr -name * stat

在以“.stat”結尾的/ usr目錄下查找每個文件。

找到/ var / spool -mtime +60

找到60天前修改的/ var / spool目錄下的每個文件。

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的文件並刪除它們,處理文件名的方式是正確處理包含單引號,雙引號,空格或換行符的文件名或目錄名。 -name測試出現在-type測試之前,以避免必須在每個文件上調用stat(2)

找 。 -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中

找到$ HOME -mtime 0

搜索您的主目錄中最近24小時內已修改的文件。 該命令以這種方式工作,因為每個文件上次修改後的時間除以24小時,並且任何餘數都被丟棄。 這意味著要匹配-mtime

0 ,文件將不得不在過去不到24小時前修改。

找 。 - 精子664

搜索對其擁有者和群組具有讀取和寫入權限但其他用戶可以讀取但不能寫入的文件。 符合這些標準但具有其他權限位設置的文件(例如,如果某人可以執行該文件)將不匹配。

找 。 -perm -664

搜索對其所有者和組具有讀取和寫入權限的文件,以及其他用戶可以讀取的文件,而不考慮是否存在任何額外的權限位(例如可執行位)。 例如,這將匹配具有模式0777的文件。

找 。 -perm / 222

搜索某人(他們的主人,他們的團體或其他人)可寫的文件。

找 。 -perm / 220 找到。 -perm / u + w,g + w 找到。 -perm / u = w,g = w

所有這三個命令都執行相同的操作,但第一個使用文件模式的八進製表示,而另外兩個使用符號形式。 這些命令都搜索可由其所有者或其組寫入的文件。 這些文件不必由要匹配的所有者和組寫入; 要么會做。

找 。 -perm -220 找到。 -perm -g + w,u + w

這兩個命令都做同樣的事情; 搜索可由其所有者和他們的組寫入的文件。

找 。 -perm -444 -perm / 222! -perm / 111 找到。 -perm -a + r -perm / a + w! -perm / a + x

這兩個命令都搜索每個人都可讀的文件(-perm -444或-perm -a + r),至少在寫入位設置(-perm / 222或-perm / a + w)但不可執行對於任何人(分別為!-perm / 111和!-perm / a + x)

重要提示:使用man命令( %man )查看特定計算機上的命令使用方式。