Linux find 命令詳解
阿新 • • 發佈:2018-12-18
簡介:
在 Linux 中 find 是一個強大的檔案查詢工具, 可以用於查詢系統或指定目錄的指定檔案, find 支援正則表示式和統配符進行匹配
find 命令格式:
# 使用格式 find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression] 格式說明: path find 查詢的路徑, / 表示在當前系統中查詢 expression 表示式, 預設為 print(將 find 的匹配結果輸出到螢幕)
find 引數:
OPTIONS(選項): 和符號連結相關的選項: -P 不跟蹤符號連結(預設行為) -L 當 find 檢查或列印有關檔案的資訊時, 所使用的資訊應取自連結指向的檔案的屬性, 而不是連結本身 -H 和 -L 引數剛好相反, 當 find 檢查或列印有關檔案的資訊時, 所使用的資訊應取自符號連結的屬性 示例: # 建立測試環境 ln -s /etc/ /tmp/ # 查詢 etc/fstab, 預設 find 命令不會跟蹤符號連結, 所以 find 不會搜尋 /tmp/etc/ 所指向的 /etc/, 這時 find 不會得到的任何內容 find /tmp/ -name 'fstab' # 查詢 etc/fstab, 使用 -L 選項, find 會搜尋 /tmp/etc/ 所指向的 /etc/ 和其子目錄, 這時可以查詢到 fstab find -L /tmp/ -name 'fstab' # -H 使用符號連結本身的屬性, 所以 find 將 /tmp/etc/ 當成一個檔案, 這時 find 不會得到的任何內容 find -H /tmp/ -name 'fstab' 注意: 1、-P -L -H 可以同時出現, 但是隻有處於命令列最後的那個引數生效 2、當 -L 或 -H 生效時, 任何作為 -newer 引數列出的符號連結將被取消引用, 並且時間戳將從符號連結指向的檔案中取出(-newerXY、-anewer、-cnewer 和 -newer 的行為相同) 除錯和優化: -D 除錯模式 -O 指定優化級別(預設為0) 0、1 級別 0 和 級別 1 相同, 這是預設的優化級別, 對錶達式進行重新排序, 以便基於 -name 和 -regex 的查詢 2 對於基於 -type 或者 -xtype 的查詢, 先從 inode 中讀取檔案型別 3 啟用快速查詢 EXPRESSIONS(表示式): OPTIONS(選項): -d、-depth 在查詢檔案時, 首先查詢當前目錄中的檔案, 然後再在其子目錄中查詢 -maxdepth n find 查詢目錄的最大深度 -mindepth n find 從指定的目錄的第幾層深度開始查詢 -mount 查詢檔案時不跨越檔案系統的 mount 點 -follow 和 -L 引數類似 -regextype 指定後面所使用的正則表示式語法, 預設為 emacs posix-awk 類 awk 的正則表示式語法 posix-basic 基本正則表示式 posix-egrep 不使用正則表示式 posix-extended 擴充套件正則表示式 TESTS(測試, 檢查檔案是否符合表示式): 可以將數字引數指定為: +n 大於n -n 小於n n 等於n 常用引數: -anewer file 將指定目錄下的所有檔案和 file 對比, 輸出讀取或寫入時間在 file 讀取或寫入之後的檔案, 該選項會的連結檔案進行跟蹤 -newer file 和 anewer 類似, 將指定目錄下的所有檔案和 file 對比, 輸出修改時間在 file 修改之後的檔案, 該選項會的連結檔案進行跟蹤 -empty 查詢空檔案或目錄 -fstype type 查詢指定檔案系統上的檔案 -gid n 根據檔案 gid 查詢 -uid 根據檔案 uid 查詢 -user 根據屬主查詢 -group gname 根據檔案屬組查詢 -name 根據檔名進行查詢 -iname 和 -name 類似, 但是 -iname 不區分大小寫 -regex 使用正則表示式進行查詢 -iregex 和 -regex 類似, 但是 -iregex 不區分大小寫 -nogroup 查詢沒有屬組的檔案(檔案的屬組列為數字) -nouser 查詢沒有屬主的檔案(檔案的屬主列為數字) -perm 根據檔案許可權進行查詢 -readable 查詢可讀檔案 -writable 查詢可寫檔案 -path 通常和 -prune 一起使用, 表示忽略某個目錄 -prune 忽略 -path 指定的目錄, 不能和 -delete、-depth 引數一起使用 -size n[cwbkMG] 根據檔案大小進行查詢 b 512 位元組(預設) c 1 位元組 w 2 個位元組的單詞 k 1 k M 1 m G 1 g -type c b 塊裝置 c 字元裝置 d 目錄 p 命名管道 f 檔案 l 連結檔案 s socket 檔案 和時間查詢相關: time 型別介紹: mtime(Change): 當檔案內容傳送改變時更新 mtime ctime(Modify): 當檔案許可權或屬性發生改變時更新 ctime(內容更新時也會更新該值, 和 mtime 唯一區別在於, 當權限或屬性發生改變時 mtime 不會改變) atime(Access): 檔案被訪問時發生改變 relatime: 如果一個檔案不停的被訪問每一次都更新 atime 的話將會大大的增加磁碟 IO 的壓力, 所有 Linux kernel 2.6 之後出現了 relatime 屬性 使用這個屬性之後只有當 atime 的時間落後 mtime 或者 ctime 之後 atime 才會更新, 在 centos 中想要使用 relatime 必須使用 mount -o relatime 或者在 /etc/fstab 中新增 relatime 引數 在 Linux 中使用 stat [file|dir] 可以看見這個幾個值的具體資訊 -ctime n 檔案狀態最後一次修改是在 n 天之前 -atime n 檔案最後一次訪問是在 n 天之前 -mtime n 檔案最後一次修改是在 n 天之前 -cmin n 檔案狀態最後一次修改是在 n 分鐘之前 -amin n 檔案最後一次訪問是在 n 分鐘之前 -mmin n 檔案最後一次修改是在 n 分鐘之前 ACTIONS(對符合表示式的結果進行操作): -delete 刪除查詢到的檔案或目錄(謹用) -exec 將查詢的檔案或目錄傳遞給 exec 後面的 shell 命令作為引數 -ls 將查詢到的檔案或目錄傳遞給 ls -l 命令作為該命令的引數 -ok 類似於 -exec , 但是在執行命令之前會詢問使用者是否執行 -print 預設動作, 將查詢結果輸出的螢幕 -printf format 類似於 -print, 但是可以自定義輸出格式
常用示例:
# 查詢系統中的所有以 .log 結尾的檔案 find / -name "*.log" # 查詢系統中許可權為 777 的檔案或目錄, 並使用 ls -l 檢視其詳細資訊 find / -perm 777 -ls # 查詢系統中屬主和屬組為 postfix 的檔案或目錄 find / -user postfix -group postfix # 刪除 /var/log/ 空檔案和目錄 find /var/log/ -empty -delete # 使用"擴充套件正則表示式"查詢系統中的所有以.so和.log結尾的檔案 find / -regextype posix-extended -regex ".*\.log$|.*\.so$" # 檢視 /etc/ 最近三天修改過的檔案 find /etc/ -mtime -3 # 檢視 /etc/ 30天前修改過的檔案 find /etc/ -mtime +30 # 查詢 /var/log/ 所有以 .log 結尾的檔案, 通過 chmod 命令將其許可權改為 666 find /var/log/ -name "*.log" -exec chmod 666 {} \; # 檢視許可權是否已經更改 find /var/log/ -name "*.log" -ls # 查詢系統檔案大小大於 10M 的所有檔案 find / -type f -size +10M # 查詢系統檔案大小小於 1k 的所有檔案 find / -type f -size -1k # 系統中沒有屬組和屬主的檔案或目錄 find / -nouser -nogroup # 查詢系統中的 .log 檔案, 查詢深度不超過 3 層 find / -maxdepth 3 -name "*.log" # 查詢系統中的 .log 檔案, 查詢深度從第 4 層開始 find / -mindepth 4 -name "*.log"