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
沒有留言:
張貼留言