====== 在 Linux 下使用 find 指令查詢目錄與檔案的速查筆記 ====== http://blog.miniasp.com/post/2010/08/27/Linux-find-command-tips-and-notice.aspx 在 Linux 平台下找檔案不外乎使用威力強大的 find 命令,威力強大的背後就是有一點點學習曲線,不過整體上來說還算簡單,因此想寫一篇文章留下備忘,讓自己日後可以快速查閱參考。 【 基本語法 】 查詢檔案名稱 ( 也可以查詢「目錄名稱」,其中 * 是萬用字元 ) find $HOME -name '*.mp3' 註1: $HOME 是 Linux 下的一個環境變數,預設指向執行帳號的 HOME 目錄 查詢檔案名稱 (不區分大小寫) find /etc -iname 'Network' 指定只要搜尋「檔案」名稱 find /var/log -iname '*.log' -type f 指定只要搜尋「目錄」名稱 find /etc -iname 'apache2' -type d 補充說明:可用的 –type 參數值如下 b block (buffered) special c character (unbuffered) special d directory ( 一般目錄 ) p named pipe (FIFO) f regular file ( 一般檔案 ) l symbolic link s socket D door (Solaris) 找尋所有檔案大小大於 50MB 的檔案 find /var -type f -size +50M 註1: 不加上 –name 參數即代表搜尋所有檔案 找尋所有檔案大小小於 50MB 的檔案 find /var -type f -size -50M 尋找超過 7 天沒有被存取或修改過的檔案 (判斷檔案存取時間) find $HOME -type f -atime +7 尋找曾經在 7 天內被存取或修改過的檔案 (判斷檔案存取時間) find $HOME -type f -atime -7 尋找超過 10 分鐘沒有被存取或修改過的檔案 (判斷檔案存取時間) find $HOME -type f -amin +10 尋找曾經在 10 分鐘內被存取或修改過的檔案 (判斷檔案存取時間) find $HOME -type f -amin -10 尋找檔案建立時間已超過 30 天的檔案 find $HOME -type f -ctime +30 尋找特定使用者的檔案 ( 以帳號名稱 tom 為例 ) find $HOME -type f -user tom 【 進階應用 】 刪除 30 天以上未經存取過的暫存檔案 ( 注意: 以下指令最後一個分號(;)前一定要加上反斜線 ) find /tmp -type f -atime +30 -print -exec rm -f '{}' \; 註1: 加上 –print 是為了讓被刪除的檔案檔名一併顯示在畫面上,這個參數可以省略 註2: 使用 –exec 會讓查詢到的每一個檔案路徑代入 ‘{}’ 位置,一個檔案會執行一遍 rm 命令 刪除 30 天以上未經存取過的暫存檔案 ( 使用 xargs 當成單一命令的參數 ) find /tmp -type f -print0 | xargs -0 rm -v 註1: 加上 –print0 是為了讓輸出的結果不以「斷行字元」分隔,而改以 null 為結果的分隔字元 註2: 使用 xargs 命令加上 –0 是為了讓傳入的資料以 null 字元當成參數的分隔 註3: 使用 rm 命令加上 –v 是為了能顯示出被刪除的檔案名稱,這個參數可以省略 註4: 使用 xargs 會將所有 find 命令查到的檔案轉換成 rm 的參數列,如果檔案過多可能會執行失敗! 註5: 使用 xargs 可確保後面的程式 ( rm ) 只執行一次,所以理論上執行速度較快! 相同參數需輸入多筆並且以「或」邏輯運算時要用 –o 參數串接起來 例1:同時找兩種檔名樣式的檔案 find $HOME -name '*.mp3' -o -user '*.ogg' 例2:同時找兩個擁有者的檔案 find /usr/local -user user1 -o -user user2 【 注意事項 】 使用萬用字元時務必加上單引號( ' ) !!以下是錯誤示範!! [user1@server ~]# find $HOME -name *.txt find: paths must precede expression Usage: find [path...] [expression] 相關連結 [[https://help.ubuntu.com/community/find|find - Community Ubuntu Documentation]] ===== 檔案權限 ===== -perm 可以指定檔案的權限,例如列出權限是 777 的所有檔案: find . -type f -perm 0777 這個指令在檢查系統漏洞時會常用到。另外我們也可以用排除的方式,列出所有權限不是 777 的檔案: find . -type f ! -perm 777 find 也用來搜尋具有特殊權限的檔案,例如找尋權限是 644 而且有 SGID 的檔案(關於 SGID 可以參考鳥哥的文件): find . -perm 2644 找尋權限是 644 而且有 Sticky Bit 的檔案: find . -perm 1551 列出系統中所有 SUID 的檔案: find / -perm /u=s 列出系統中所有 SGID 的檔案: find / -perm /g+s 列出唯讀的檔案: find / -perm /u=r 列出可執行的檔案: find / -perm /a=x ===== 執行指令 ===== -exec 可以讓我們將搜尋出來的結果,使用其他的指令進行後續的處理動作,例如將目前目錄下所有權限為 777 的檔案找出來,用 chmod 將這些檔案的權限更改為 644: find . -type f -perm 0777 -print -exec chmod 644 {} \; 找出所有權限為 777 的目錄,將這些目錄用 chmod 把權限改為 755: find / -type d -perm 777 -print -exec chmod 755 {} \; 找出檔名為 gtwang.txt 的所有檔案,並且刪除它: find . -type f -name "gtwang.txt" -exec rm -f {} \; 找出所有的 *.mp3 檔,並且刪除: find . -type f -name "*.mp3" -exec rm -f {} \;