2021年11月3日 星期三

【Linux】Find 指令介紹

find 指令介紹

find 是一個相當強大的搜尋工具,本身提供了相當多的參數選項能夠精準的搜尋到所需要的檔案目錄,並支援格式化輸出所搜尋到的檔案目錄。

由於 find 本身是採行即時搜尋整個檔案系統的方式,因此搜尋上需要耗費較多時間,磁碟 IO 部分也會比較繁重。

find 程式執行完成後,若是有尋找到指定條件的檔案,返回值為 0,否則為 1。


find 程式使用

find 程式的使用語法規則為:

find [/path …] [expression …]


指令參考:

find /home/oracle/sh/log -type f -name "*log" -ctime +1 -exec rm -f {} ;


find /home/oracle/sh/log -type f -name "*log" -ctime +0 |xargs rm -f



使用範例 1:

由目前的所在目錄開始尋找所有檔案目錄

find


使用範例 2:

由指定的目錄為起始點開始尋找所有檔案目錄

find /usr/share


使用範例 3:

由多個指定的目錄為起始點開始尋找所有檔案目錄

find /etc /usr/lib


由於 find 功能相當強大,下面將依照相關功能分類解說 find 程式的使用


檔案類型:

find 程式內,可以使用 –type 指定搜尋的類型。下面列出可供使用的選項類型:


b:區塊裝置 (block)

c:字元裝置 (character)

d:目錄 (directory)

p:命名管線 (named pipe,FIFO)

f:一般檔案 (regular file)

l:符號連結檔 (symbolic link)

s:網路連結裝置檔案 (socket)


使用範例 1:

列出 /etc 目錄,所有的子目錄:

find /etc –type d


使用範例 2:

列出位於 /usr/share 目錄,所有的一般檔案:

find /etc –type f


使用範例 3:

列出位於 /bin 目錄,所有的符號連結檔案

find /bin -type l

檔案目錄名稱:

使用 find 尋找檔案時,可以透過 -name的參數選項,指定搜尋特定

目錄內,是否有指定的檔案目錄名稱。該參數支援一般 shell 的通配字元

的樣式。-name 本身是區分大小寫的,-iname 參數選項則是不區分大小寫。


使用範例 1:

搜尋 /etc 目錄內,檔案名稱為 ifcfg-eth0 的一般檔案:

find /etc -type f -name “ifcfg-eth0”


使用範例 2:

搜尋 /usr/share/man 目錄內,以 printf 開頭的一般檔案:

find /usr/share/man -type f -name “printf*”


使用範例 3:

搜尋 /usr/X11R6/bin 目錄內,名稱包含 x 或是 X 的一般檔案

find /usr/X11R6/bin -iname “*x*”


檔案大小:

使用 find 程式時,透過 -size 參數的使用,可以精準的搜尋出

特定檔案長度的檔案。-size 參數的使用,支援的單位有:


b:block (1 block = 512 byte)

c:byte

k : kbyte

w : word byte


實際在使用時,可以搭配 + 與 – 表示大於或者是小於指定的大小。


使用範例 1:

搜尋 /bin 目錄內,檔案長度為大約為 10K 的一般檔案

find /bin -type f -size 10k


使用範例 2:

搜尋 /bin 目錄內,以 a ~ m 開頭,檔案長度大於 10K 的一般檔案

find /bin -type f -name “[a-m]*” -size +10k


使用範例 3:

搜尋 /usr/bin 目錄內,檔案長度在 50k ~ 100k 範圍內的檔案

find /usr/bin -type f -size +50k –size -100k



檔案目錄權限:

使用 find 程式時,透過 -perm 參數的使用,可以搜尋出特定

權限屬性的檔案。


使用上,支援 + 與 – 的方式搜尋出特定屬性權限的檔案,

表示的意義為:

perm mode

權限屬性為 mode內任何 Bit 欄位

perm +mode

權限屬性包含 mode 內任何 Bit 欄位

perm –mode

權限屬性至少要包含 mode 內任何 Bit 欄位


使用範例 1:

搜尋 /bin 目錄內,權限為 755 的一般檔案

find /bin -type f -perm 755


使用範例 2:

搜尋 /usr/bin 目錄內,任何人都可以執行的檔案

find /bin -type f -perm -0111


使用範例 3:

搜尋 /usr 目錄與其下子目錄,權限至少為 644 的一般檔案

find /usr -type f -perm +644


使用者群組資訊:

使用 find 程式時,透過 -user、-group可以搜尋特定所屬使用者、

群組的檔案目錄。透過 -nouser、-nogroup 可以找到在系統 /etc/passwd、

/etc/group 檔案內沒有對應紀錄的檔案目錄。透過 -node 可以找出 inode

編號的檔案目錄。


使用範例 1:

以 / 目錄開始,尋找出 owner 為 root,setuid 屬性,任何人都可以執行的檔案

find / -type f -user root -perm -4111


使用範例 2:

以 /home 開始,尋找出 owner 為 peter,可執行屬性的一般檔案

find /home -type f -user peter -perm +0111


使用範例 3:

尋找整個檔案系統,列出沒有 owner 與 group 對應的孤兒清單

find / -nouser -nogroup


使用範例 4:

以 /usr 目錄開始,尋找出 inode 編號為 19011 的一般檔案

find /usr -type f -inum 19011


時間欄位:

Unix 的檔案系統上,對於檔案的建立、存取、修改等資訊都會加以

紀錄。使用 find 程式時,可以搭配 -amin、-atime、-cmin、-ctime、-mmin、-mtime 等參數選項搜尋出特定時間欄位屬性的檔案目錄。


參數意義:


-amin

檔案於幾分鐘前被存取過

-atime

檔案於幾天前被存取過

-cmin

檔案的狀態於幾分鐘前被修改過

-ctime

檔案的狀態於前幾天前被修改過

-mmin

檔案內容於幾分鐘前被修改過

-mtime

檔案內容於幾天前被修改過


參數使用支援 +、- 等項目,用來表示大於該時間區段,

或者是小於該時間區段。


使用範例 1:

搜尋 /etc 目錄,列出前一天到現在被修改過的檔案

find /etc –mtime -1


使用範例 2:

搜尋 /var/log 目錄,列出已經有 7 天以上沒有更動過的一般檔案

find /var/log -type f -mtime +7


搜尋深度:

使用 find 程式時,可以搭配 –maxdepth 指定搜尋檔案目錄時,其最大的路徑深度。


使用範例 1:

搜尋 /etc 該層目錄 (不包含其下子目錄) 內所有的一般檔案

find /etc -type f -maxdepth 1


使用範例 2:

搜尋 /usr/lib 該層目錄內,檔案附檔名為 .so ,長度大於 100k的一般檔案

find /usr/lib -type f -maxdepth 1 -size +100k


外部程式呼叫:

find 程式支援 –exec 與 –ok 參數,能夠將執行 find 得到的搜尋的結果,呼叫外部程式作為該程式的參數進行處理。

另外常與 find 程式搭配使用的還有 xargs 程式,該程式能夠將程式

透過標準輸出的訊息,轉為呼叫外部程式,並以該標準輸出的訊息,作為該

程式的命令列引數。 xargs 程式的使用,多半都是透過管線的方式呼叫執行。


使用範例 1:

以 / 目錄開始進行,搜尋檔案名稱為 core的一般檔案,然後加以刪除

find / -type f -name “core” -exec rm –f {} ;


上面範例中,{} 為代換 find 搜尋到的檔案完整路徑名稱,然後作為

rm -f 程式的引數。需要注意是,使用 –exec 參數,最後要使用 “;” 分號作為結尾字元,不過因為 shell 對於命令列上的 “;” 分號有特殊的

解釋,所以需要在 “;” 分號前面加上 “” 反斜線,以避免 shell 解釋

“;” 為命令的區隔,find 程式也才能夠判定命令的結尾。


若搭配 -exec 參數時改用 -ok 替換,表示執行命令時會提示使用者是否確定要執行。


若是使用 xargs 使用的話,上述範例可以修改為

find / -type f -name “core” | xargs rm -f


使用範例 2:

搜尋 /home/peter 目錄,找出副檔名為 “.doc” 的一般檔案,然後使用

touch 程式將檔案時間更新到現在最新時間

find /home/pter -type f -name “*.doc” -exec touch {} ;


上面範例,也可以使用 xargs 程式達成

find /home/pter -type f -name “*.doc” | xargs touch

沒有留言:

張貼留言