linux-find命令入門教程

文章目錄

語法

find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

#參數說明 :
find 根據下列規則判斷 path 和 expression,在命令列上第一個 - ( ) , ! 之前的部份爲 path,之後的是 expression。如果 path 是空字串則使用目前路徑,如果 expression 是空字串則使用 -print 爲預設 expression。
expression 中可使用的選項有二三十個之多,在此只介紹最常用的部份。
-amin<分鐘>:查找在指定時間曾被存取過的文件或目錄,單位以分鐘計算;
-anewer<參考文件或目錄>:查找其存取時間較指定文件或目錄的存取時間更接近現在的文件或目錄;
-atime<24小時數>:查找在指定時間曾被存取過的文件或目錄,單位以24小時計算;
-cmin<分鐘>:查找在指定時間之時被更改過的文件或目錄;
-cnewer<參考文件或目錄>查找其更改時間較指定文件或目錄的更改時間更接近現在的文件或目錄;
-ctime<24小時數>:查找在指定時間之時被更改的文件或目錄,單位以24小時計算;
-daystart:從本日開始計算時間;
-depth:從指定目錄下最深層的子目錄開始查找;
-empty:尋找文件大小爲0 Byte的文件,或目錄下沒有任何子目錄或文件的空目錄;
-exec<執行指令>:假設find指令的回傳值爲True,就執行該指令;
-false:將find指令的回傳值皆設爲False;
-fls<列表文件>:此參數的效果和指定“-ls”參數類似,但會把結果保存爲指定的列表文件;
-follow:排除符號連接;
-fprint<列表文件>:此參數的效果和指定“-print”參數類似,但會把結果保存成指定的列表文件;
-fprint0<列表文件>:此參數的效果和指定“-print0”參數類似,但會把結果保存成指定的列表文件;
-fprintf<列表文件><輸出格式>:此參數的效果和指定“-printf”參數類似,但會把結果保存成指定的列表文件;
-fstype<文件系統類型>:只尋找該文件系統類型下的文件或目錄;
-gid<羣組識別碼>:查找符合指定之羣組識別碼的文件或目錄;
-group<羣組名稱>:查找符合指定之羣組名稱的文件或目錄;
-help或——help:在線幫助;
-ilname<範本樣式>:此參數的效果和指定“-lname”參數類似,但忽略字符大小寫的差別;
-iname<範本樣式>:此參數的效果和指定“-name”參數類似,但忽略字符大小寫的差別;
-inum<inode編號>:查找符合指定的inode編號的文件或目錄;
-ipath<範本樣式>:此參數的效果和指定“-path”參數類似,但忽略字符大小寫的差別;
-iregex<範本樣式>:此參數的效果和指定“-regexe”參數類似,但忽略字符大小寫的差別;
-links<連接數目>:查找符合指定的硬連接數目的文件或目錄;
-iname<範本樣式>:指定字符串作爲尋找符號連接的範本樣式;
-ls:假設find指令的回傳值爲Ture,就將文件或目錄名稱列出到標準輸出;
-maxdepth<目錄層級>:設置最大目錄層級;
-mindepth<目錄層級>:設置最小目錄層級;
-mmin<分鐘>:查找在指定時間曾被更改過的文件或目錄,單位以分鐘計算;
-mount:此參數的效果和指定“-xdev”相同;
-mtime<24小時數>:查找在指定時間曾被更改過的文件或目錄,單位以24小時計算;
-name<範本樣式>:指定字符串作爲尋找文件或目錄的範本樣式;
-newer<參考文件或目錄>:查找其更改時間較指定文件或目錄的更改時間更接近現在的文件或目錄;
-nogroup:找出不屬於本地主機羣組識別碼的文件或目錄;
-noleaf:不去考慮目錄至少需擁有兩個硬連接存在;
-nouser:找出不屬於本地主機用戶識別碼的文件或目錄;
-ok<執行指令>:此參數的效果和指定“-exec”類似,但在執行指令之前會先詢問用戶,若回答“y”或“Y”,則放棄執行命令;
-path<範本樣式>:指定字符串作爲尋找目錄的範本樣式;
-perm<權限數值>:查找符合指定的權限數值的文件或目錄;
-print:假設find指令的回傳值爲Ture,就將文件或目錄名稱列出到標準輸出。格式爲每列一個名稱,每個名稱前皆有“./”字符串;
-print0:假設find指令的回傳值爲Ture,就將文件或目錄名稱列出到標準輸出。格式爲全部的名稱皆在同一行;
-printf<輸出格式>:假設find指令的回傳值爲Ture,就將文件或目錄名稱列出到標準輸出。格式可以自行指定;
-prune:不尋找字符串作爲尋找文件或目錄的範本樣式;
-regex<範本樣式>:指定字符串作爲尋找文件或目錄的範本樣式;
-size<文件大小>:查找符合指定的文件大小的文件;
-true:將find指令的回傳值皆設爲True;
-type<文件類型>:只尋找符合指定的文件類型的文件;
-uid<用戶識別碼>:查找符合指定的用戶識別碼的文件或目錄;
-used<日數>:查找文件或目錄被更改之後在指定時間曾被存取過的文件或目錄,單位以日計算;
-user<擁有者名稱>:查找符和指定的擁有者名稱的文件或目錄;
-version或——version:顯示版本信息;
-xdev:將範圍侷限在先行的文件系統中;
-xtype<文件類型>:此參數的效果和指定“-type”參數類似,差別在於它針對符號連接檢查。
-mount, -xdev #只檢查和指定目錄在同一個文件系統下的文件,避免列出其它文件系統中的文件
-amin n #在過去 n 分鐘內被讀取過
-anewer file  #比文件 file 更晚被讀取過的文件
-atime n #在過去n天內被讀取過的文件
-cmin n #在過去 n 分鐘內被修改過
-cnewer file #比文件 file 更新的文件
-ctime n #在過去n天內被修改過的文件
-empty #空的文件-gid n or -group name : gid 是 n 或是 group 名稱是 name
-ipath p, -path p #路徑名稱符合 p 的文件,ipath 會忽略大小寫
-name name, -iname name # 文件名稱符合 name 的文件。iname 會忽略大小寫
-size n #文件大小 是 n 單位,b 代表 512 位元組的區塊,c 表示字元數,k 表示 kilo bytes,w 是二個位元組。-type c : 文件類型是 c 的文件。
d: 目錄
c: 字型裝置文件
b: 區塊裝置文件
p: 具名貯列
f: 一般文件
l: 符號連結
s: socket
-pid n #process id 是 n 的文件

你可以使用 ( ) 將運算式分隔,並使用下列運算。
exp1 -and exp2
! expr
-not expr
exp1 -or exp2
exp1, exp2

實例

find . -name "*.c" #將目前目錄及其子目錄下所有延伸檔名是 c 的文件列出來。
find . -type f #將目前目錄其其下子目錄中所有一般文件列出
find . -ctime -20 #將目前目錄及其子目錄下所有最近 20 天內更新過的文件列出
find /var/log -type f -mtime +7 -ok rm {} \;#查找/var/log目錄中更改時間在7日以前的普通文件,並在刪除之前詢問它們
find /var/log -type f -mtime +7 -ok rm {} \;#查找/var/log目錄中更改時間在7日以前的普通文件,並在刪除之前詢問它們
find . -type f -perm 644 -exec ls -l {} \;#查找前目錄中文件屬主具有讀、寫權限,並且文件所屬組的用戶和其他用戶具有讀權限的文件
find / -type f -size 0 -exec ls -l {} \;#爲了查找系統中所有文件長度爲0的普通文件,並列出它們的完整路徑
find . #列出當前目錄及子目錄下所有文件和文件夾
find /home -name "*.txt" #在/home目錄下查找以.txt結尾的文件名
find /home -iname "*.txt" #同上,但忽略大小寫
find . \( -name "*.txt" -o -name "*.pdf" \) #當前目錄及子目錄下查找所有以.txt和.pdf結尾的文件
find . -name "*.txt" -o -name "*.pdf" 
find /usr/ -path "*local*" #匹配文件路徑或者文件
find . -regex ".*\(\.txt\|\.pdf\)$" #基於正則表達式匹配文件路徑
find . -iregex ".*\(\.txt\|\.pdf\)$" #同上,但忽略大小寫
find /home ! -name "*.txt" #否定參數,找出/home下不是以.txt結尾的文件
find . -type 類型參數 #根據文件類型進行搜索
#類型參數列表:
f 普通文件
l 符號連接
d 目錄
c 字符設備
b 塊設備
s 套接字
p Fifo
基於目錄深度搜索

find . -maxdepth 3 -type f  #向下最大深度限制爲3
find . -mindepth 2 -type f #搜索出深度距離當前目錄至少2個子目錄的所有文件
find . -type f 時間戳 #根據文件時間戳進行搜索
UNIX/Linux文件系統每個文件都有三種時間戳:
訪問時間(-atime/天,-amin/分鐘):用戶最近一次訪問時間。
修改時間(-mtime/天,-mmin/分鐘):文件最後一次修改時間。
變化時間(-ctime/天,-cmin/分鐘):文件數據元(例如權限等)最後一次修改時間。

find . -type f -atime -7 #搜索最近七天內被訪問過的所有文件
find . -type f -atime 7 #搜索恰好在七天前被訪問過的所有文件
find . -type f -atime +7 #搜索超過七天內被訪問過的所有文件
find . -type f -amin +10 #搜索訪問時間超過10分鐘的所有文件
find . -type f -newer file.log #找出比file.log修改時間更長的所有文件
find . -type f -size 文件大小單元 #根據文件大小進行匹配
文件大小單元:
b —— 塊(512字節)
c —— 字節
w —— 字(2字節)
k —— 千字節
M —— 兆字節
G —— 吉字節
find . -type f -size +10k #搜索大於10KB的文件
find . -type f -size -10k #搜索小於10KB的文件
find . -type f -size 10k #搜索等於10KB的文件
#刪除匹配文件
find . -type f -name "*.txt" -delete #刪除當前目錄下所有.txt文件
#根據文件權限/所有權進行匹配
find . -type f -perm 777#當前目錄下搜索出權限爲777的文件
find . -type f -name "*.php" ! -perm 644 #找出當前目錄下權限不是644的php文件
find . -type f -user tom #找出當前目錄用戶tom擁有的所有文件
find . -type f -group sunk #找出當前目錄用戶組sunk擁有的所有文件
#藉助-exec選項與其他命令結合使用
find .-type f -user root -exec chown tom {} \;#找出當前目錄下所有root的文件,並把所有權更改爲用戶tom
上例中,{} 用於與-exec選項結合使用來匹配所有文件,然後會被替換爲相應的文件名。
find $HOME/. -name "*.txt" -ok rm {} \; #找出自己家目錄下所有的.txt文件並刪除
上例中,-ok和-exec行爲一樣,不過它會給出提示,是否執行相應的操作。
find . -type f -name "*.txt" -exec cat {} \;> all.txt #查找當前目錄下所有.txt文件並把他們拼接起來寫入到all.txt文件中
find . -type f -mtime +30 -name "*.log" -exec cp {} old \; #將30天前的.log文件移動到old目錄中
find . -type f -name "*.txt" -exec printf "File: %s\n" {} \; #找出當前目錄下所有.txt文件並以“File:文件名”的形式打印出來
-exec ./text.sh {} \; #因爲單行命令中-exec參數中無法使用多個命令,以下方法可以實現在-exec之後接受多條命令

搜索但跳出指定的目錄
find . -path "./sk" -prune -o -name "*.txt" -print #查找當前目錄或者子目錄下所有.txt文件,但是跳過子目錄sk

find其他技巧收集
find . -empty #要列出所有長度爲零的文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章