天天看點

find

目錄

locate

FIND

文法

查找條件

檔案名

屬主和屬組

使用者ID

檔案類型

檔案大小

時間戳

權限

處理動作

練習

xargs與exec

面試題

兩個例子

張賀,多年網際網路工作經驗,擔任過網絡工程師、系統內建工程師、LINUX系統運維工程師,負責過大規模叢集架構自動化運維管理工作,擅長Web叢集架構與自動化運維,曾負責國内某電商運維工作。

檔案查找就是在檔案系統上查找查找符合條件的檔案。

linux對檔案查找的方式有兩種:非實時查找和實時查找,非實時查找就是隻查找檔案系統的索引 ,我們知道系統上所有的檔案都是有索引的,我們可以把linux系統的索引了解為就是檔案的目錄,但是這個目錄并不是你建立了檔案然後立即更新的,它是有周期性的(定時或者是在系統不繁忙的時候),也就是說你剛才建立的檔案,馬上使用非實時查找的方式去查找是找不到的,因為它還沒有來的及做索引,是以如果我們使用非實時查找的工具都查找剛建立的檔案時,要首先把索引更新一下,使用”updatedb”指令即可更新,值得一提的是這個指令并不能随便用,如果你的伺服器産生了成千上萬的檔案,還沒來得更新索引,你使用updatedb指令手動更新一下的話,會非常占用資源,如果你伺服器在你更新的時候正處于繁忙的狀态下,很有可能當機。

如:

當我們使用windows時,當我們打開我的電腦的時候,有的時候會很慢,在搜尋框當中會出現進度條,其實這個時候就是在更新索引,那麼怎樣才能觸發系統更新索引呢?windows和linux一樣都是周期性的更新(定時、或者不繁忙的時候)。
find

由于locate的種種弊端,我們經常使用的一般是find指令。

直接使用find指令什麼也不帶的話,相當于ls –a 列出所有的檔案及目錄

-name “檔案名稱”,支援使用通配符,* ? [ ] [^] -iname “檔案名稱”,不區分大小寫,同樣也支援通配符 -regex “正規表達式”,使用此選項可支援正規表達式 應重點掌握

如果我們删除了一個使用者,那麼原本屬于這個使用者的檔案的所有人和所屬組就沒有了,隻剩下id。如果還想要删除的話就得根據uid來查找删除,還是比較實用的。

-uid USERID:查找屬主為指定UID号的檔案

-gid GROUPID:查找屬組為指定GID号的檔案

-type [l|s|b|p|c|d]

f 普通檔案

l 符号連結

d 目錄

c 字元裝置

b 塊裝置

s 套接字

檔案大小和時間戳類似,可以使用數軸的方式進行記憶。

+3

四天之前

大于3K

3天前的一天,3天和4天之間

3K----2K之間

-3

3天以内

2K以内

以時間戳記憶的時候一定要結合檔案大小進行記憶,兩者相關聯。

mtime是以天為機關

解析:

-4就代表在四天之内,當然是包括四天的,也就是小于等于四天。

而4就代表在四天之前,五天之内的

而+4就代表在是五天之前了,當然也包括五天,也就是大于等于5天。

權限也有加減号之分,值得一提的是加号在centos7上面不再支援,僅支援負數和整數。

+MODE:任何一類(u,g,o)對象的權限中隻要能一位比對即可,有或者之意。

-MODE:每一類對象都必須同時擁有為其指定的權限标準,有并且之意。

對于+号的解釋:來,來,來,:任何一類(u,g,o)對象的權限中隻要能一位比對即可,有或者之意舉個例子:假如一個檔案是的權限002的話,那麼使用+002可以查找出來,使用+004不可以,因為004的最後一類的權限是4,而4僅僅代表的是讀權限罷了,如果是+006就可以,因為+006最後一位是包括讀和寫,滿足一項即可,是以002也滿足。

如果檔案的權限772,我們使用002也可以比對到,因為最後一類的最後一位可以被002當中的2比對到,再次強調,任何一類對象的當中的任意一位被包括即可,但是這個包括是對位的,假如說檢視+666的話,滿足這個條件的權限就有:200、400、020、222、002、220……442,420,240,444,都可以

-print :預設的處理動作,顯示至螢幕 -ls:類似于對查找到的檔案執行ls –l指令 -delete:删除查找到的檔案 -fls /PATH/TO/SOMFILE查找到的所有檔案的長格式資訊儲存到指定檔案中 -ok COMMND {} \; 對查找到的每個檔案執行由COMMAND指定的指令 對于每個檔案執行指令之前,都會互動要求使用者确認 -exec COMMAND {} \; 對查找到的檔案執行由COMMAND指定的指令

注意:find傳遞查找到的檔案至後面指定的指令時,查找到所有符合條件的檔案一次性傳遞給後面的指令;有些指令不能授受過多的參數,此時指令執行可能會失敗,另一個方式可規避此問題:

查找/etc目錄下以tions結尾的目錄或者檔案然後把其詳細資訊儲存到/tmp/下的test.txt檔案下

查找/etc/下大于5M的檔案或目錄并顯示其詳細資訊。

檢視/etc下小于1M的檔案或目錄删除之

查找/var目錄下屬主為root,且屬組為mail的所有檔案或目錄

查找/usr目錄下不屬于root、bin、.或hadoop的所有檔案或目錄

查找/etc目錄一點點最近一周内容被修改過,同時屬主不為root和hadoop的檔案或目錄

查找目前系統沒有屬主且沒有屬組,最近一個周内被通路過的檔案或目錄

查找/etc/目錄下大于1M且類型為普通檔案的檔案或目錄

查找/etc目錄下所有使用者都沒有寫權限的檔案

查找/etc/init.d目錄下,所有使用者都有執行權限,且其它使用者有寫權限的檔案

檢視/etc/目錄下,修改時間是三天前的檔案或目錄

解析:做上面這個題是糾結的,如果是把三天前了解成為3天之前不包括三天的話使用+3是對的,因為+3意思着大于等于4天;如果把前三天了解成為3天前包括三天的話就得使用+2,因為+2代表大于等于3天。

假如當天是2010年1月5日,我想要查找1月3日建立哪些檔案?

解析一下,今天是3号,我建立一個檔案test.txt,然後我把時間改為5号。我想要查找到3号建立什麼檔案,+2表示大于等于3天,也就是三天前,對于目前時間(5号)來說,算上5号這一天的話,大于等于3天指2号那天或者是2号之前建立的檔案,是以并沒有找到;當我反條件改成+1的話,也就是大于等于2,對于目前的時間(5号)來說,大于等于2天也就是在3号的那天或者是在3天之前,檔案正好是3号建立的,是以正好可以查找到。

假如當天是2010年1月5日,我想要查找3天之内建立哪些檔案?

解析:-3代表大于大于等于0小于3,也就是說當天或者3,4,5号的任意一天都會被查找到,并不包括2号的那天,為什麼?因為是大于等于0小于3,并不是等于3,是以不包括2号。

由此我們總結一下:

如果按照天數查找:

如果讓我們檢視一下在3天内修改的檔案使用-3即可

如果讓我們檢視一下在3天前修改的檔案使用+2即可

如果按照檔案大小查找:

大于3M就是+3

小于3M就是-4

如果按照權限查找:

所有都包括某個權限使用減号

僅一項包括使用+号

完全比對什麼号也不加

今天去同學公司的時候,和他們人事聊了聊,看到了桌子上的面試題,有一道題很有意思,一共有三份試題,來了三個人面試,兩個人寫錯了,其中一個沒回答上來,我也是無語了,就這水準,還出來面試,聽人事說口氣還大的很,不知道從哪裡來的自信?不知道他們是昨學的?

面試題是這樣:

請找出/test.dir目錄下的檔案名中包含test關鍵字的檔案并将其全部删除(注:不少于兩種方法)

有兩位面試者都是這麼寫的:

find

這麼寫看上去是沒錯的,但實際的操作肯定不行的,還是太嫩了!

find

為什麼這麼操作不行呢?find向外輸出的是什麼?我們是按照檔案名查找的,找到的其實就檔案名組成的字元流,你把一個字元流通過管道傳送給rm指令,rm自然會正常的執行,但是這個字元流與檔案路徑沒有關系,這樣删除的隻是find的檢視後的結果,是以就無法删除,那麼要怎麼做才行能删除呢?隻要将FIND查找到的字元流轉換成路徑就行了,這樣方法就多了,我們可以通過find自帶的exec或者借助xargs指令将字元流轉換為真實的路徑就行了,我們來嘗試一下:

再來嘗試另一種辦法,這種方法是find自帶的,效果和上面的例子是一樣的。

再來一種更加簡單粗暴的方法:

我們再來舉一個例子體會一下:

仔細體會一下,體會到了嗎?好了,我來總結一下吧!

如果沒有xargs的話,grep隻會把find的結果當做是字元流,并不是将其當做是檔案,當有了xargs之後,這些字元流就變成了真正的路徑,其實将xargs換成find自帶的exec也是可以的,如下所示:

請找出/test.dir目錄下的檔案名中包含test關鍵字的檔案并将其全部移動到/tmp目錄(注:不少于兩種方法)

如何操作呢?

find

第一種方式:

第二種方式:

#mv的文法是這樣的:mv <被移動的檔案> <目标檔案夾>,但是這裡find會将結果補全到最後也就是<目标檔案夾>的位置,怎麼辦?

#exec是不能用了,我們可以這樣,如下所示:

#xargs我們已經了解了,那-t是什麼意思?mv -t的意思就是将<被移動的檔案>和<目标檔案夾>換一下位置,這樣find的結果就正好補全到<被移動的檔案>,這不就完美了!

第三種方式:

第三種方式與第二種方式差不多,不過我們不用mv的-t選項了,而使用xargs自帶的機制了,如下所示:

#這次我們沒有改變mv的文法,隻是用中括号代替了<被移動的檔案>,不要忘了xargs前面要加一個-i的選項,隻有這樣中括号才有意義!

題目2

請找出/test.dir目錄下的檔案中包含test關鍵字的檔案并将其全部複制到/tmp目錄(注:不少于兩種方法)

我打字累了,不解釋了,第一個題目看懂後,這一個題目看懂自然不成問題!!!

現在,我真想大聲對那三個面試者說:

find

哈哈!

我們在使用find的時候一定要注意,find的查詢範圍要界面小一些,如果直接從根直接查找的話容易把記憶體給打滿,一旦記憶體滿了之後就容易觸發系統的保護機制,會随機殺死一個占用記憶體最高的程序,如果系統中運作着mysql,系統很容易會将其幹掉!!!

繼續閱讀