find 命令_Linux下查找文件:find 命令
find命令用于在指定目錄中根據(jù)tests測試條件搜索符合tests測試條件的文件
概要
該命令的形式如下:
[-H第一次看到該命令的人可能會被其復雜繁多的選項參數(shù)嚇到。其實在日常開發(fā)中,很多選項并不多見。所以上述命令格式可以簡化如下:
[path...Path
即為查找文件的路徑,命令將在指定目錄及其子目錄下進行查找文件,默認為當前路徑
Expression
表達式,由option選項、test測試條件、action動作組成。option選項,均返回true。test測試條件即為當前文件的判定條件,其返回true/false;action動作是作用于當前文件的動作,其同樣返回true/false。
如果在表達式中除了-prune外無其他action。則默認對整個表達式結(jié)果為true的文件執(zhí)行 -print 動作,而不是直接在后面添加-print。 示例如下:
操作符
通常在表達式會包含多個option、test、action,如下代碼 code 1 處所示。當未顯式指定操作符時,默認為 "-a" (即AND)操作符,故其命令的完整形式為code 2處所示
'./subTest' -iname常用操作符如下:
- expr1 -a expr2 : AND 邏輯與,使用短路求值。亦可寫為expr1 -a expr2。如果 expr1 結(jié)果為 false,expr2 將不會被執(zhí)行
- expr1 -o expr2 : OR 邏輯或,使用短路求值。如果 expr1 結(jié)果為 true,expr2 將不會被執(zhí)行
- ( expr ) : 由于 AND 邏輯與的優(yōu)先級 高于 OR 邏輯或的優(yōu)先級。故,可以通過添加括號改變默認的操作符優(yōu)先級。需要注意的是,命令中的左右括號需要使用反斜杠進行轉(zhuǎn)義。即,( expr )
- ! expr : NOT 邏輯非。對expr的結(jié)果進行取反
示例如下:
Tests 測試條件
在日常開發(fā)中,tests 測試條件最為常用,現(xiàn)對常用的測試篩選項進行介紹:
根據(jù)文件名查找文件
根據(jù)文件名來查找文件,這也是日常最常用的:
# 大小寫敏感 -iname <filename>其中,文件名參數(shù)可以使用Linux的文件名通配符,注意其不是正則
根據(jù)文件權(quán)限
根據(jù)文件(Linux下,目錄也屬于文件)權(quán)限來篩選文件,其有3種匹配模式
# 嚴格匹配所給權(quán)限-perm -num- 嚴格匹配
其將嚴格匹配所給權(quán)限的0和1設(shè)置,即結(jié)果文件的權(quán)限碼必須和給定權(quán)限碼num完全一致
-perm num- 滿足所給全部權(quán)限位即可
對于給定權(quán)限碼num,文件全部滿足給定的權(quán)限位即可,對于多余的權(quán)限位并不敏感
-perm -num- 滿足所給任一權(quán)限位即可
對于給定權(quán)限碼num,文件若存在任一一個滿足給定的權(quán)限位即可,對于多余的權(quán)限位并不敏感
-perm /num排除某個目錄
查找文件時,如果已經(jīng)知道某個目錄下不存在我們所需文件,可以在find中指定排除,以免浪費時間搜索。下述命令中的-path test條件用來判定是否存在指定路徑。如果是,則其返回true,并根據(jù)邏輯與的短路求值策略繼續(xù)執(zhí)行-prune action動作,用于排除該路徑
-path pathName -prune-path pathName -a -prune- 示例1
1處查看檢索當前目錄下所有的內(nèi)容,而2處則是查看除subTest目錄外的文件
相信這里會讓人疑惑的地方在于 -print 前面的 -o 或操作符,根據(jù)前文所述,-path ./subTest -a -prune 用于排除指定目錄,然后-print是查看剩下的文件,中間應該是用 -a 與操作符來連接啊。好,那我們先將上面代碼中的 -o -print 改為 -a -print。來看看會發(fā)生什么
咦?這里竟然輸出的結(jié)果是不是讓人很吃驚…………竟然是我們需要排除的目錄。其實,問題是在于我們沒有理清find命令的執(zhí)行邏輯,find是對path下的所有文件(目錄文件夾也是文件的一種)依次去執(zhí)行表達式,根據(jù)test條件的結(jié)果來判定是否執(zhí)行action。對于本例而言,當對subTest目錄進行判定時,-path ./subTest 測試條件結(jié)果肯定為true,然后執(zhí)行-prune以不對該目錄下的文件進行遍歷搜索測試,其是一個action且結(jié)果恒為真。如果此時后面如果是-a -print,則對當前測試的文件(即,subTest目錄)執(zhí)行打印動作,而遍歷其他文件(比如,bers文件)進行測試時,-path ./subTest 測試條件結(jié)果為false,根據(jù)短路求值策略,均不會執(zhí)行 -prune動作和-print動作,故最終我們看到的輸出結(jié)果,只有./subTest目錄文件;同理,如果后面是-o -print的話,測試 ./subTest 目錄文件時,-path ./subTest -prune 結(jié)果為true,由于后面是-o 與操作符,根據(jù)短路求值策略,其將不會執(zhí)行-print動作,而遍歷其他文件(比如,bers文件)進行測試時,-path ./subTest 測試條件結(jié)果為false,根據(jù)短路求值策略,其將不會執(zhí)行-prune動作,且 -path ./subTest -prune結(jié)果為false。而對于-print動作而言,由于其前面為 -o 或操作符,將會執(zhí)行-print動作,即打印當前測試文件(比如,bers文件)
- 示例2
按名查找并排除指定目錄
-a、-o 優(yōu)先級
如前文所述,-a 與操作符優(yōu)先級高于 -o 或操作符優(yōu)先級。所以如果不注意這點,很容易會產(chǎn)生Bug。例如,我們期望找到名為 bers 或 numbers.txt 文件,代碼如下:
從上文執(zhí)行的結(jié)果,可以看到?jīng)]有成功查找出bers文件,原因很簡單,由于 -a 優(yōu)先級比 -o 高,-print 動作只會在-iname 'numbers.txt' 測試條件返回true時執(zhí)行。所以上述命令等價于下圖所示
同理,即使將numbers.txt換為一個不存在的文件名 abc ,也同樣不會輸出存在的bers文件
所以,對于該問題,需要通過添加括號來改變操作符的默認優(yōu)先級,使其滿足我們的需求
總結(jié)
以上是生活随笔為你收集整理的find 命令_Linux下查找文件:find 命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手环调整时间
- 下一篇: python linux编程与windo