簡介:
在 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"
