Linux文件搜索命令介紹——locate、find、xargs、touch、stat

本文主要介紹兩個用在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操作,以標準格式輸出其文件名以及所要求的其它信息
-print 將匹配的文件的全路徑以標準形式輸出。該操作是默認操作
-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時,會用到該選項
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章