find 是 Linux 文件搜索的瑞士軍刀,掌握 -a(AND)、-o(OR)、-not(NOT)三大邏輯運算符,能構建出極其精準的查找條件。本文通過 20+ 實戰案例,從基礎語法到複雜組合,徹底講透 find 邏輯查找。
| 運算符 | 含義 | 優先級 | 備註 |
|---|---|---|---|
-a / -and | 邏輯與(同時滿足) | 高 | 隱式默認,find . -type f -name "*.log" 等同 -a 連接 |
-o / -or | 邏輯或(滿足其一) | 低 | 需配合括號分組,否則優先級陷阱極易導致邏輯錯誤 |
-not / ! | 邏輯非(取反) | 高 | 緊跟其後的測試條件取反 |
-name 模式:文件名匹配(支援通配符 * ? [])-type 類型:f=普通文件 d=目錄 l=符號鏈接 c=字符設備 b=塊設備-user 用戶 / -group 組:擁有者匹配-size [+|-]數字[c|k|M|G]:文件大小(+ 大於,- 小於,默認 512 字節塊)-perm 模式:權限匹配(精確/至少/任一位,見下文)# /etc 下查找 >1M 的文件,顯示完整路徑
find /etc -size +1M -exec echo {} \;
# 等效 xargs 寫法(空格分隔,適合後續管道)
find /etc -size +1M | xargs echo
# 當前目錄下屬於 user1 的文件
find . -user user1
# 非 user1 的文件
find . -not -user user1
# 屬於 user1 OR 是普通文件
find . -user user1 -o -type f
# 大於 1M OR 是目錄
find . -size +1M -o -type d
# 小於 1M AND 是普通文件(精準定位小文件)
find . -size -1M -a -type f
-perm 三種模式差異巨大,必須區分:
| 寫法 | 匹配邏輯 | 示例 |
|---|---|---|
-perm 644 | 權限完全等於 644(含 setuid/setgid/sticky 位) | 僅匹配 -rw-r--r-- |
-perm -644 | 權限位至少包含 644(二進制 1 全覆蓋) | 匹配 644、664、744、777 等 |
-perm +644 | 權限位任一位匹配(二進制任一 1 覆蓋) | 匹配 600、640、644、400 等 |
# 查找 /etc 下權限不包含「組寫、其他寫」的文件(安全審計)
find /etc -not -perm -022
# 查找至少擁有「用戶讀、組讀」的文件
find /etc -perm -440
# 查找:(屬於 user1 AND 是文件) OR (大於 10M AND 是目錄)
find . \( -user user1 -a -type f \) -o \( -size +10M -a -type d \)
# 查找:非 user1 且非 user2 的普通文件
find . -not \( -user user1 -o -user user2 \) -a -type f
注意:Shell 中括號需轉義 \( \),否則被 Shell 解析導致語法錯誤。
-exec cmd {} \;:逐個執行,開銷大,但處理帶空格文件名安全-exec cmd {} +:批量執行(類 xargs),高效,推薦| xargs cmd:流水線處理,需配合 -print0 / xargs -0 處理特殊字符-mount 避免跨文件系統(如 /proc /sys)。-ls 或 -print 預覽,確認無誤再加執行動作。find /tmp -type f -mtime +7 -delete。