天天看點

菜鳥學Linux指令:find指令 查找檔案

find指令是linux下最常用的指令之一,靈活的使用find指令,你會發現查找檔案變得十分簡單。

指令格式

find [指定查找目錄]  [查找規則(選項)]  [查找完後執行的動作]

參數規則

-name 按照檔案名查找檔案

-iname 根據檔案名查找,但是不區分大小寫

-perm 按照檔案權限來查找檔案

-prune 使用這一選項可以使find指令不在目前指定的目錄中查找

-user 根據屬主來查找檔案

-group 根據屬組來查找檔案

-uid 根據uid來查找檔案

-gid 根據gid來查找檔案

關聯條件的使用

-a 連接配接兩個不同的條件(兩個條件必須同時滿足)

-o 連接配接兩個不同的條件(兩個條件滿足其一即可)

-not 對條件取反的

根據檔案時間戳的相關屬性來查找檔案

-mmin n 檔案最後一次修改是在n分鐘之内

-mtime n 檔案最後一次修改是在 n*24小時之内

find /tmp –atime +5 表示查找在五天内沒有通路過的檔案

-amin n 檔案最後一次通路是在n分鐘之内

-atime n 檔案最後一次通路是在 n*24小時之内

-cmin n 檔案的狀态在n分鐘内被改變

-ctime n 檔案狀态在n*24小時内(也就是n天内)被改變

-type 根據檔案類型來查找檔案

菜鳥學Linux指令:find指令 查找檔案
菜鳥學Linux指令:find指令 查找檔案

-size 根據大小來查找檔案

-perm 根據檔案權限查找檔案

-newer file1 ! file2 查找更改時間比檔案file1新但比檔案file2舊的檔案

查找完執行

-print 預設情況下的動作

-ls 查找到後用ls 顯示出來

-ok [commend] 查找後執行指令的時候詢問使用者是否要執行

-exec [commend] 查找後執行指令的時候不詢問使用者,直接執行

-nouser and -nogroup 在整個系統中查找既沒有屬主又沒有屬組的檔案(這樣的檔案通常是很危險的,應該及時清除)

相關指令

locate指令,locate指令其實是“find -name”的另一種寫法,但是要比後者快得多,原因在于它不搜尋具體目錄,而是搜尋一個資料庫(/var/lib/locatedb),這個資料庫中含有本地所有檔案資訊。linux系統自動建立這個資料庫,并且每天自動更新一次,是以使用locate指令查不到最新變動過的檔案。為了避免這種情況,可以在使用locate之前,先使用updatedb指令,手動更新資料庫。

whereis指令,在特定目錄中查找符合條件的檔案。和find相比,whereis查找的速度非常快,這是因為linux系統會将 系統内的所有檔案都記錄在一個資料庫檔案中,當使用whereis和下面即将介紹的locate時,會從資料庫中查找資料,而不是像find指令那樣,通過周遊硬碟來查找,效率自然會很高。但是該資料庫檔案并不是實時更新,預設情況下時一星期更新一次,是以,我們在用whereis和locate 查找檔案時,有時會找到已經被删除的資料,或者剛剛建立檔案,卻無法查找到,原因就是因為資料庫檔案沒有被更新。

which指令,which是通過 path環境變量到該路徑内查找可執行檔案,基本功能是尋找可執行檔案。

type指令,它是用來區分某個指令到底是由shell自帶的,還是由shell外部的獨立二進制檔案提供的。如果一個指令是外部指令,那麼使用-p參數,會顯示該指令的路徑,相當于which指令。

場景範例

1. 用檔案名查找檔案

這是find指令的一個基本用法。

# find -name "nginx.conf"

2.用檔案名查找檔案,忽略大小寫

# find -iname "nginx.conf"

3. 使用mindepth和maxdepth限定搜尋指定目錄的深度

在root目錄及其子目錄下查找passwd檔案。

# find / -name passwd

在root目錄及其1層深的子目錄中查找passwd. (例如root — level 1, and one sub-directory — level 2)

# find -maxdepth 2 -name passwd

在root目錄下及其最大兩層深度的子目錄中查找passwd檔案. (例如 root — level 1, and two sub-directories — level 2 and 3 )

# find / -maxdepth 3 -name passwd

在第二層子目錄和第四層子目錄之間查找passwd檔案。

# find -mindepth 3 -maxdepth 5 -name passwd

4. 查找後指令,在find指令查找到的檔案上執行指令

下面的例子展示了find指令來計算所有不區分大小寫的檔案名為“mycprogram.c”的檔案的md5驗證和。{}将會被目前檔案名取代。

find -iname "mycprogram.c" -exec md5sum {} \;

5.相反比對

顯示所有的名字不是mycprogram.c的檔案或者目錄。由于maxdepth是1,是以隻會顯示目前目錄下的檔案和目錄。

find -maxdepth 1 -not -iname "mycprogram.c"

6. 使用inode編号查找檔案

任何一個檔案都有一個獨一無二的inode編号,借此我們可以區分檔案。建立兩個名字相似的檔案,例如一個有空格結尾,一個沒有。

從ls的輸出不能區分哪個檔案有空格結尾。使用選項-i,可以看到檔案的inode編号,借此可以區分這兩個檔案。

你可以如下面所示在find指令中指定inode編号。在此,find指令用inode編号重命名了一個檔案。

find -inum 16187430 -exec mv {} new-test-file-name \;

7. 根據檔案權限查找檔案

找到對組使用者具有隻讀權限的檔案。

find . -perm g=r -type f -exec ls -l {} \;

8. 找到home目錄及子目錄下所有的空檔案(0位元組檔案)

下面指令的輸出檔案絕大多數都是鎖定檔案盒其他程式建立的place hoders

find ~ -empty

隻列出你home目錄裡的空檔案。

find . -maxdepth 1 -empty

隻列出當年目錄下的非隐藏空檔案。

find . -maxdepth 1 -empty -not -name ".*"

9. 查找5個最大的檔案

下面的指令列出目前目錄及子目錄下的5個最大的檔案。這會需要一點時間,取決于指令需要處理的檔案數量。

find . -type f -exec ls -s {} \; | sort -n -r | head -5

10. 查找5個最小的檔案

方法同查找5個最大的檔案類似,差別隻是sort的順序是降序。

find . -type f -exec ls -s {} \; | sort -n | head -5

上面的指令中,很可能你看到的隻是空檔案(0位元組檔案)。如此,你可以使用下面的指令列出最小的檔案,而不是0位元組檔案。

find . -not -empty -type f -exec ls -s {} \; | sort -n | head -5

11. 使用-type查找指定檔案類型的檔案

隻查找socket檔案

find . -type s

查找所有的目錄

find . -type d

查找所有的一般檔案

find . -type f

查找所有的隐藏檔案

find . -type f -name ".*"

查找所有的隐藏目錄

find -type d -name ".*"

12. 通過和其他檔案比較修改時間查找檔案

顯示在指定檔案之後做出修改的檔案。下面的find指令将顯示所有的在ordinary_file之後建立修改的檔案。

# find -newer ordinary_file

13. 通過檔案大小查找檔案

使用-size選項可以通過檔案大小查找檔案。

查找比指定檔案大的檔案

find ~ -size +100m

查找比指定檔案小的檔案

find ~ -size -100m

查找符合給定大小的檔案

find ~ -size 100m

注意: – 指比給定尺寸小,+ 指比給定尺寸大。沒有符号代表和給定尺寸完全一樣大。

14. 給常用find操作取别名

若你發現有些東西很有用,你可以給他取别名。并且在任何你希望的地方執行。

常用的删除a.out檔案。

alias rmao="find . -iname a.out -exec rm {} \;"

# rmao

删除c程式産生的core檔案。

alias rmc="find . -iname core -exec rm {} \;"

# rmc

15. 用find指令删除大型打封包件

下面的指令删除大于100m的*.zip檔案。

find / -type f -name *.zip -size +100m -exec rm -i {} \;"

16.找到在1個小時内被更改的檔案

find -mmin -60

菜鳥學Linux指令:find指令 查找檔案

或者

find -mtime -1 

17.找到1個小時内被通路過的檔案

# find . -amin -60

18.查找一個小時内狀态被改變的檔案

# find . -cmin -60

19.搜尋僅僅限定于檔案,不顯示檔案夾

# find / -name "*.log"

# find / -xdev -name "*.log"

20.僅僅查找非隐藏的檔案(不顯示隐藏檔案)

如果我們查找的時候不想隐藏檔案也顯示出來,可以使用下面的正則式查找:

下面的指令會顯示目前目錄及其子目錄下15分鐘内檔案内容被修改過的檔案,并且隻列出非隐藏檔案。也就是說,以.開頭的檔案時不會顯示出來的

21.查找檔案修改時間在某一檔案修改後的檔案

# find -newer /etc/passwd

22.僅僅在目前檔案系統中搜尋

下面這個指令會搜尋根目錄/及其子目錄下所有.log結尾的檔案名。如果你有多個分區在/下面,那麼這個搜尋會去搜尋所有的被挂載的分區:

如果我們使用-xdev選項,那麼僅僅會在在目前檔案系統中搜尋,下面是在xdev的man page上面找到的一段-xdev的定義:

-xdev don’t descend directories on other filesystems.

下面的指令會在/目錄及其子目錄下搜尋目前檔案系統(也就是/挂載的檔案系統)中所有以.log結尾的檔案,也就是說如果你有多個分區挂載在/下面,下面的搜尋不會去搜尋其他的分區的(比如/home/)