本文主要介紹兩個用在Linux系統中搜索文件的工具。
locate
:通過文件名查找文件find
:在文件系統目錄框架中查找文件
同時,我們也會介紹一個通常與文件搜索命令一起使用、處理搜索結果文件列表的命令。xargs
:從標準輸入中建立、執行命令行
還有兩個輔助工具touch
:更改文件的日期時間stat
: 顯示文件或文件系統的狀態
0.參考文獻
《Linux命令行大全》 [美] William E. Shotts. Jr 著 郭光偉 郝記生 譯, 人民郵電出版社
如有侵權,可聯繫博主刪除。
1.locate—較簡單的方式查找文件
locate
通過快速搜索數據庫,以尋找路徑名與給定子字符串相匹配的文件,同時輸出所有匹配結果
例如,查找zip字符串開頭的程序,由於是程序,因此目錄名應該以bin/結尾
$ locate bin/zip
輸出爲:
/usr/bin/zipdetails
/usr/bin/zipgrep
/usr/bin/zipinfo
可以使用locate組合grep的方式進行更詳細的搜索
$ locate zip | grep bin
輸出爲
/lib/firmware/qed/qed_init_values_zipped-8.10.10.0.bin
/lib/firmware/qed/qed_init_values_zipped-8.10.5.0.bin
/lib/firmware/qed/qed_init_values_zipped-8.15.3.0.bin
/lib/firmware/qed/qed_init_values_zipped-8.20.0.0.bin
/lib/firmware/qed/qed_init_values_zipped-8.4.2.0.bin
/lib/firmware/qed/qed_init_values_zipped-8.7.3.0.bin
/usr/bin/funzip
/usr/bin/gpg-zip
/usr/bin/unzip
/usr/bin/unzipsfx
/usr/bin/zipdetails
/usr/bin/zipgrep
/usr/bin/zipinfo
/usr/lib/klibc/bin/gunzip
/usr/lib/klibc/bin/gzip
2. find—較複雜的方式查找文件
locate程序查找文件僅僅是依據文件名,而find
程序則是依據文件的各種屬性在既定的目錄(及其子目錄)裏查找。
最簡單的用法用find命令列出當前系統主目錄(~)下的文件列表清單
$ find ~
以上命令列出了主目錄下所有文件的清單。
可以使用wc
程序計算find命令搜索到的文件總量。
$ find ~ | wc -l
1552390
find命令可以用來搜索符合特定要求的文件,通過綜合應用test
選項、action
選項以及options
選項實現高級文件搜索。
2.1 test選項
假定我麼想要查找的是目錄文件,可以添加test選項來達到此目的。
$ find ~ -type d | wc -l
42928
添加test參數-type -d可以將搜索範圍限制爲目錄。
下面例子中使用-type f則表示只對普通文件進行搜索
$ find ~ -type f | wc -l
1472037
表1 find支持搜索的文件類型
文件類型 | 描述 |
---|---|
b | 塊設備文件 |
c | 字符設備文件 |
d | 目錄 |
f | 普通文件 |
l | 符號鏈接 |
另外,還可以添加其他test選項實現依據文件大小和文件名的搜索。
如下命令行就是用來查找所有符合*.jpg通配符格式以及大小超過1MB的普通文件。
$ find ~ -type f -name "*.jpg" -size +1M | wc -l
2910
表2 find 支持的計量單位
字母 | 單位 |
---|---|
b | 512字節的塊 |
c | 字節 |
w | 兩個字節的字 |
k | KB(每單位包含1,024字節) |
M | MB(每單位包含1,048,576字節) |
G | GB(每單位包含1,073,741,824字節) |
find支持多種test參數,表3概括了一些常用的參數。注意,前邊的“+
”和“-
”號的用法也適用於所有用到數值參數的情況。
表3 find命令的test參數選項
test參數 | 描述 |
---|---|
-cmin n | 匹配n分鐘前改變狀態(內容或屬性)的文件或目錄,不到n分鐘就用-n,超過n分鐘就用+n |
-cnewer file | 匹配內容或屬性的修改時間比文件file更晚的文件或目錄 |
-ctime n | 匹配系統中n*24小時前的文件狀態被修改的文件或目錄 |
-empty | 匹配空文件或空目錄 |
-group name | 匹配屬於group組的文件或目錄。name可描述爲組名,也可以是其ID號 |
-iname pattern | 與-name test項功能類似只是不區分大小寫 |
-inum n | 匹配索引節點是n的文件 |
-mmin n | 匹配n分鐘前內容被修改的文件或目錄 |
-mtime n | 匹配n*24小時前只有內容被更改的文件或目錄 |
-name pattern | 匹配有特定通配符模式的文件或目錄 |
-newer file | 匹配內容的修改時間比file文件更近的文件或目錄。這在編寫shell腳本進行文件備份時非常有用。每次創建備份時,更新某個文件,然後用find+此參數選項來確定上一次更新後哪個文件改變了 |
-nouser | 匹配不屬於有效用戶的文件或目錄。 |
-nogroup | 匹配不屬於有效組的文件或目錄 |
-perm mode | 尋找訪問權限與既定模式匹配的文件或目錄 |
-samfile name | 與-inum test選項類似。匹配與file文件有相同node號的文件 |
-size n | 匹配n大小的文件 |
-type c | 匹配c類型的文件 |
-user name | 匹配屬於name用戶的文件和目錄,name可以是用戶名也可以描述爲該組的ID號 |
操作符
find命令的test選項可以結合邏輯操作從而建立具有複雜邏輯關係的匹配條件。
可以使用下面命令來查找那些訪問權限不是0600的文件和訪問權限不是0700的子目錄
$ find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \)
表4 find命令的邏輯操作符
操作符 | 功能描述 |
---|---|
-and(與操作符) | 查找使該操作符兩邊檢驗條件都是真的匹配文件。有時縮寫爲-a。如果兩個檢測條件之間沒有顯式的顯示操作符,and就是默認的邏輯關係 |
-or(或操作) | 查找使該操作符兩邊任何一邊的檢測條件爲真的匹配文件。有時簡寫爲-o |
-not(-非操作) | 查找使該操作符後面的檢測條件爲假的匹配條件,有時直接寫爲`! |
()(括號操作符) | 有時爲了獲得想要的結果必須擾亂默認的執行順序,即使不需要,將一串字符表達式括起來對提高命令的可讀性有幫助。通常使用反斜槓來避免括號字符在shell中的特殊意義 |
2.2 action選項
前面的find命令已經查找到所需的文件,下面處理這些文件,find命令允許直接對搜索結果執行動作。
預定義動作
表5 預定義的find命令操作
動作 | 功能描述 |
---|---|
-delet | 刪除匹配文件 |
-ls | 對匹配文件執行ls操作,以標準格式輸出其文件名以及所要求的其它信息 |
將匹配的文件的全路徑以標準形式輸出。該操作是默認操作 | |
-quit | 一旦匹配成功便退出 |
例如
$ find ~ -print
可以使用find來刪除滿足特定條件的文件。例如刪除.bak後綴的備份文件
$ find ~ -type f -name '*.bak' -delete
記住,每個test選項和action選項之間默認的邏輯關係是與(and)邏輯。所以test選項和action選項的順序很重要。
用戶自定義操作
除了已有的預定於操作命令,同樣可以任意調用用戶想要執行的操作命令。傳統的方法就是像以下命令行使用**-exec操作**。
-exec command {};
該格式中的command表示要執行的操作命令名,花括號{}代表的是當前路徑,分號作爲必須的分隔符表示命令結束。使用-exec完成-delet操作示例如下:
-exec rm '{}' ';'
注意,這裏同樣需要將花括號引起來或者用轉義符隔開。
提高效率
當使用-exec操作時,每次查找到匹配文件後都會調用執行一次指定命令。
通過將命令行末尾的分號改爲加號,便可將find命令所搜索到的匹配結果作爲指定命令的輸入,從而一次性完成對所有文件的操作。例如
之前的例子是
$ find ~ -type f -name 'foo*' -exec ls -l '{}' ';'
每次找到匹配文件後都會執行一次ls命令。將上述命令改爲下面的命令行。
$ find ~ -type f -name 'foo*' -exec ls -l '{}' +
可以得到相同結果,不過ls只運行一次。
同樣我們可以使用xargs
命令獲得相同的效果,xargs處理標準輸入信息並將其轉變爲某指定命令的輸入參數列表。
$ find ~ -type f -name 'foo*' -print | xargs ls -l
stat命令
stat命令可以說是ls的增強版,該命令會將系統所掌握文件的所有信息及屬性全部顯示出來
$ stat log
File: 'log'
Size: 12288 Blocks: 24 IO Block: 4096 directory
Device: 801h/2049d Inode: 40214858 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 1005/ limj) Gid: ( 1005/ lixj)
Access: 2020-06-14 10:00:13.585565220 +0800
Modify: 2020-06-14 08:00:09.118055234 +0800
Change: 2020-06-14 08:00:09.118055234 +0800
Birth: -
2.4 option選項
option選項用於控制find命令的搜索範圍。
表7 常用的option選項
選項 | 描述 |
---|---|
-depth | 引導find程序處理目錄前先處理目錄內文件,當指定-delete操作時,該參數選項會自動調用 |
-maxdepth levels | 當執行測試條件行爲時,設置find程序陷入目錄數的最大級別數 |
-mindepth levels | 在應用測試條件和行爲之前,設置find程序陷入目錄數的最小及別數 |
-mount | 引導find不去遍歷掛載在其它文件系統上的目錄 |
-noleaf | 指導find程序不要基於“正在搜索類UNIX文件系統”的假設來優化它的搜索,當掃描DOS/Windows文件系統和CD時,會用到該選項 |