天天看點

linux下find指令詳解與執行個體分析

  1. find指令的一般使用格式
  2. find指令的常用選項和執行個體

find指令的一般使用格式

使用man指令檢視find文檔的内容,可以看到find指令的功能和使用格式。

linux下find指令詳解與執行個體分析

根據幫助文檔先來對find指令的一般格式做一個簡單介紹。

find指令功能:在一個目錄(及子目錄)中搜尋檔案.
find指令使用格式:find[-H]  [-L]  [-P]  [path...]  [expression]
其中:其中,'-H' '-L' '-P'三個選項主要是用來處理符号連接配接,'-H'表示隻跟随指令行中指定的符号連接配接,'-L'表示跟随所有的符号連接配接,'-P'是預設的選項,表示不跟随符号連接配接。
path : find指令所查找的目錄路徑。例如 /home 在根目錄下的home目錄裡面進行查找。
expression :可以分為[option]  [action]
option: 用來指定find指令的常用選項,比如-name,-type,-perm等
action:  用來指定find指令後續可執行的一些動作,比如-print,-exec,-ok等
           

find指令的常用選項詳解

常用選項根據使用目的可分為3部分分别是:

時間相關的選項,使用者或使用者組名稱相關的選項,檔案權限以及名稱相關的選項

時間相關選項

檢視幫助文檔可以看到如下資訊

linux下find指令詳解與執行個體分析

這類參數選項有

-atime,-ctime,-mtime,-amin, -cmin, -mmin等這些時間選項用法基本相似。而(-*time與-*min差別在于前者以24小時作為機關,後者以分鐘作為機關)我們以-mtime為例做以介紹

-mtime作用和用法詳細介紹

-mtime n: n代表數字,意思是列出在n天之前的“一天之内”被修改過的檔案名。
-mtime +n: “+n”代表列出n天之前(不含第n天本身)被修改過的檔案名。
-mtime -n: “-n" 代表列出在n天之内(含n天本身)被修改過的檔案名
           

-mtime n的使用

例如指令使用

find /home -mtime 1 -exec ls -ld { } \;

這條指令的意思是在根目錄下的home目錄中查找一天之前的”一天内的“被更改過的檔案并将找到的檔案輸出在終端。後面的-exec ls -ld { } \ 在後面會進行詳細介紹

linux下find指令詳解與執行個體分析

可以看出列出的是昨天(26号)一天内的檔案資訊。

-mtime +n的使用

例如使用指令

find /home/god -mtime +10 -exec ls -l { } \;

上面指令的意思是列出/目錄下home目錄中的god目錄 符合10天以前修改過的檔案名。然後把這些檔案詳細資訊顯示出來。

linux下find指令詳解與執行個體分析

從檔案資訊可以看出,所列出的檔案都是10天以前的檔案。

-mtime -n的使用

例如使用指令

find ./cmd/ -mtime -3 -exec ls -l {} \;

意思是在目前目錄下的cmd目錄中查找3天之内(含3天本身)被更改過的檔案的檔案名,最後輸出顯示。27号三天内由26 25 24号,是以如圖

linux下find指令詳解與執行個體分析

可以看到.file檔案是12月24建立的。

在使用指令

find ./cmd/ -mtime -2 -exec ls -l {} \;

作為對比如圖

linux下find指令詳解與執行個體分析

可以看出前兩天内,24号的檔案就找不到了(不屬于兩天内的範圍)

-newer file1 ! file2

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

使用者或使用者組名稱相關的選項

這類選項參數有-uid,-gid,-user,-group,-nouser,-nogrop等選項,下面對這些選項的使用方法和執行個體分析做以陳述。
           

-uid n:

n為數字,這個數字是使用者的賬号ID,記錄在/etc/passwd/中。可以使用id [使用者名]檢視

linux下find指令詳解與執行個體分析

例如使用指令

sudo find /home/ -uid 501 -exec ls -l {} \;

linux下find指令詳解與執行個體分析

由id指令檢視 直到uid為500的使用者是tom,是以執行find指令後查找出來了tom使用者的相關檔案。

-gid n:

這個指令與-uid相似,隻是查找的是與組使用者相關的檔案資訊,是以在此不做過多的贅述。

-user name:

name是使用者賬戶名,這個選項是通過賬戶名來查找相關檔案。

例如使用指令

sudo find /home/ -user tom -exec ls -l {} \;

linux下find指令詳解與執行個體分析

可以看出通過使用者tom名稱找到了與tom相關的檔案。

-group name:

這個指令與-user name相似,隻是查找的是與組使用者相關的檔案資訊,是以在此不做過多的贅述。

-nouser:

查找無有效屬主的檔案,即該檔案的屬主在/etc/passwd中不存在。

-nogroup

查找無有效所屬組的檔案,即該檔案所屬的組在/etc/groups中不存在。

-nouser和-ongroup可以很友善查找系統中不正常的檔案。

檔案權限以及名稱相關的選項

這類參數選項主要有-name filename,-size,-perm,-prune, -depth等
下面對這些常用的選項使用方法和執行個體進行分析。
           

-name filename:

filename是目标檔案名。直接查找要查找的檔案。

例如指令:

find /home/god/cmd -name hello.i -exec ls -l {} \;

linux下find指令詳解與執行個體分析

可以看到直接可以找到目标檔案hello.i

-size [+-] SIZE:

查找比SIZE還要大[+]或者還要小[-]的檔案。SIZE規格有

c: 代表byte

k: 代表1024bytes

例如使用指令:

sudo find /home/ -size +50k -exec ls -lh {} \;

意思是查找路徑為/home/下大于50k的檔案

linux下find指令詳解與執行個體分析

可以看出檔案大小均大于50k

-perm mode:

查找檔案權限”剛好等于“mode的檔案,舉例來說-rwsr-xr-x屬性是4755 s是檔案特殊權限值。

-perm -mode:

查找檔案權限”必須要全部包含mode權限“如-rwxr–r– 被-rwsr-xr-x包含,是以查找前者0744時後者4755也會被列出來。

-perm +mode:

查找檔案權限”包含任一mode的權限“如我們要查找-rwxr-xr-x,也就是-perm +755時,屬性為-rw——-也會被列出來。

執行個體分析

例如指令:

sudo find / -perm 4755 -exec ls -lh {} \;

linux下find指令詳解與執行個體分析

可以看到列出了所有檔案權限為4755的檔案

執行個體2

指令:

sudo find /home/god/cmd -perm -0644 -exec ls -l {} \;

linux下find指令詳解與執行個體分析

執行個體3

指令:

sudo find /home/god/cmd -perm +0744 -exec ls -l {} \;

linux下find指令詳解與執行個體分析

-type TYPE:

查找檔案類型為TYPE的,類型主要由f(一般檔案), b,c(裝置檔案),d(目錄),l(連結檔案),s(socket檔案),p(FIFO檔案)積累檔案

如指令:

sudo find /bin -type l -exec ls -l {} \;

linux下find指令詳解與執行個體分析

看以看到查找的都是連結屬性的檔案。

執行個體2

指令:

sudo find / -type b -exec ls -l {} \;

linux下find指令詳解與執行個體分析

可以看到列出的全部是裝置檔案類型的檔案名。

-prune:

使用這一選項可以使find指令不在目前指定的目錄中查找,如果同時使用-depth選項,那麼-prune将被find指令忽略。

-prune常常配合 -o選項,意思是 expr1 -o expr2 裡面,假如滿足了第一個。我們就忽略第二個

sudo find . -path "./tt" -prune -o -mtime -2 -print

查找修改時間在2天内的檔案并列印,但是排除./tt目錄

-prune, -print 是 action

-prune 是排除該條件

是以結果是:

滿足 -path “./tt” 我們就 -prune 排除

或者滿足 -mtime就 -print(當排除./ttt時候不滿足,因為沒有這個目錄。是以就列印出來2天之内的所有檔案)

執行個體如圖:

linux下find指令詳解與執行個體分析

-depth:

在查找檔案時,首先查找目前目錄中的檔案,然後再在其子目錄中查找。

find / -name “CON.FILE” -depth –print

它将首先比對所有的檔案然後再進入子目錄中查找

find指令的額外動作(action)

這類參數常用的有-print,-exec,-ok等一下對這三個額外動作做以詳細說明
           

-print:

find指令将比對的檔案輸出到标準輸出

如指令:

$ sudo find .. -mtime + -print;
           

意思是在目前目錄的上級目錄查找一天前的檔案,然後将符合的檔案輸出到标準輸出(終端)

linux下find指令詳解與執行個體分析

-exec :

find指令對比對的檔案執行該參數所給出的shell指令.相應指令的形式為’command’ { } ;,注意{ }和;之間的空格.

格式如:

sudo find /bin -type l -exec ls -l {} \;

分析:這個格式的特殊地方在于”{}“”\;“, { }代表由find找到的内容,find指令找到的内容會被放到{}位置,而-exec一直到”\;“是關鍵字,代表find額外指令的開始-exec到結束(\;),這中間的就是find指令的額外指令,上述就是”ls -l {}“

(;)在bash環境下有特殊意義是以用反斜杠轉義。

find ./ -size 0 -exec rm { } \;

删除檔案大小為零的檔案 (還可以以這樣做:rm -i find ./ -size 0 或 find ./ -size 0 | xargs rm -f &)

為了用ls -l指令列出所比對到的檔案,可以把ls -l指令放在find指令的-exec選項中:

find . -type f -exec ls -l { } \;

(這也是我們開始在用的方式在用的)

-ok:

和-exec的作用相同,隻不過以一種更為安全的模式來執行該參數所給出的shell指令,在執行每一個指令之前,都會給出提示,讓使用者來确定是否執行。

find . -name “*.c” -mtime +5 -ok rm { } ;

在目前目錄中查找所有檔案名以.c結尾、更改時間在5天前的檔案,并删除它們,隻不過在删除之前先給出提示

執行個體如下

指令:

()touch empt
()find . -size  -exec rm {} \;
           

.

linux下find指令詳解與執行個體分析

看以看到大小為0的檔案被删除了。

執行個體2

指令:

()touch empt
()find . -size  -ok rm {} \;
           

.

linux下find指令詳解與執行個體分析

看以看出”安全“了很多,避免誤删。**

繼續閱讀