Linux系統命令:find命令詳解
Linux的find 命令用于在指定目錄下查找文件和目錄。它可以使用不同的選項來過濾和限制查找的結果。
第一部分:最常用的“測試條件”(查找依據)
1. 按名稱查找 (-name, -iname)
-name “模式”:大小寫敏感。
-iname “模式”:忽略大小寫。
支持通配符:*(任意多個字符),?(單個字符),[](字符范圍)。注意:必須用引號包裹,否則 shell 會先展開通配符。
find /home -name "*.txt" # 在 /home 下查找所有 .txt 文件 find . -iname "image*.jpg" # 當前目錄及子目錄,忽略大小寫找 image 開頭的 jpg 文件 find /etc -name "*.conf" # 在 /etc 下找所有 .conf 文件
2. 按類型查找 (-type)
f:普通文件
d:目錄
l:符號鏈接
b:塊設備文件
c:字符設備文件
p:管道文件
s:套接字文件
find /var/log -type f # 查找 /var/log 下的所有普通文件 find . -type d # 查找當前目錄下的所有子目錄 find /dev -type b # 查找 /dev 下的塊設備
3. 按大小查找 (-size)
單位:c(字節),k(KiB),M(MiB),G(GiB)。默認是 b(512字節塊),建議總是顯式指定單位。
+ 表示大于,- 表示小于,無符號表示等于。
find . -size +10M # 查找大于 10MB 的文件 find /tmp -size -100k # 查找小于 100KB 的文件 find /home -size +500M -size -1G # 查找大小在 500MB 到 1GB 之間的文件
4. 按時間查找(極其實用!)
時間以“天”為單位(也可用分鐘):
-mtime n:文件內容數據最后一次被修改的時間(modify time)。
-atime n:文件最后一次被訪問的時間(access time)。
-ctime n:文件狀態最后一次改變的時間(change time),如權限、所有者。
n 的數字含義:
+7:7天以前(> 7)
7:剛好第7天(等于7)
-7:7天以內(< 7)
find /var/log -mtime +30 # 查找30天前修改過的日志文件(用于清理舊日志) find . -mtime -1 # 查找最近24小時內修改過的文件
以“分鐘”為單位(更精確):
-mmin, -amin, -cmin,用法同上。
find /etc -mmin -60 # 查找過去1小時內被修改過的文件
5. 按用戶/用戶組查找 (-user, -group)
find /home -user alice # 查找屬于用戶 alice 的所有文件 find /var/www -group www-data # 查找屬于組 www-data 的所有文件
6. 按權限查找 (-perm)
-perm 644:精確匹配權限 644。
-perm -644:文件權限包含 644 的所有位(即至少擁有這些權限)。例如,755(111 101 101)也滿足 -perm -644,因為它包含了 644(110 100 100)的所有“1”位。
-perm /644:文件權限包含 644 中任意一個“1”位(GNU find 風格,有時也用 +)。
find . -perm 755 # 查找權限恰好為 755 的文件 find / -perm -4000 -type f # 查找所有設置了 SUID 位的文件(安全審計) find . -perm /u=x # 查找所有者有執行權限的文件(符號模式)
7. 組合條件(與/或/非)
默認是“與”:-a,通常省略。find . -name "*.txt" -type f 表示同時滿足。
或:-o
非:! 或 -not
分組:\( ... \),括號需要轉義。
find . -name "*.sh" -o -name "*.bash" # 查找 .sh 或 .bash 文件 find . ! -name "*.tmp" # 查找所有不是 .tmp 結尾的文件 find . \( -name "*.jpg" -o -name "*.png" \) -size +1M # 查找大于1M的jpg或png文件
第二部分:對找到的文件“執行操作”
1. 默認操作:-print
簡單地打印出找到文件的完整路徑(每行一個)。這是默認操作,但如果指定了其他操作(如 -exec),就需要顯式寫出 -print 來保留打印。
2. 執行命令:-exec 和 -execdir(核心!)
-exec command {} \;
{} 是一個占位符,代表 find 找到的每一個文件路徑。
\; 是必須的分號,用于結束 -exec 后的命令,需要轉義。
find /tmp -type f -mtime +7 -exec rm {} \; # 刪除 /tmp 下超過7天的文件
find . -name "*.conf" -exec cp {} /backup \; # 備份所有 .conf 文件到 /backup
-execdir command {} \;
更安全。它在找到文件所在的目錄中執行命令,使用文件的相對路徑(./filename),可以避免一些路徑遍歷攻擊的風險。
find . -name "*.sh" -execdir chmod +x {} \; # 給所有 .sh 文件添加執行權限(安全方式)-exec ... + (效率更高)
使用 + 代替 \;,會將盡可能多的文件路徑作為參數一次性傳遞給命令,類似于 xargs,效率遠高于為每個文件單獨啟動一次命令。
find . -name "*.log" -exec tar -czf logs.tar.gz {} + # 將所有 .log 文件打包(一次tar命令)3. 結合 xargs
-exec 的替代方案,尤其適合處理大量文件。find 將結果通過管道傳遞給 xargs,xargs 負責分批構建并執行命令。
find . -type f -print0 | xargs -0 rm # 安全刪除(處理含空格/換行的文件名) find /path -name "*.c" | xargs grep -l "main" # 在所有.c文件中搜索包含"main"的文件
注意:使用 -print0 和 xargs -0 是處理包含空格、換行等特殊字符文件名的最佳實踐。
4. 其他操作
-delete:直接刪除找到的文件。使用前務必先用 -print 或 -ls 確認!
find . -name ".DS_Store" -delete # 刪除所有煩人的 .DS_Store 文件
-ls:以 ls -dils 的格式詳細列出找到的文件信息。
-prune:排除目錄,不進入搜索。
find . -name "node_modules" -prune -o -name "*.js" -print # 排除 node_modules 目錄,查找 .js 文件
第三部分:綜合實戰舉例
清理舊文件
# 找到 /var/log 下30天未訪問且大于100M的 .log.gz 文件并刪除
find /var/log -name "*.log.gz" -atime +30 -size +100M -exec rm -v {} \;備份最近修改的源代碼
# 找到24小時內修改的 .py 或 .java 文件,打包備份
find /project \( -name "*.py" -o -name "*.java" \) -mtime -1 -exec tar -rf backup.tar {} +查找所有空文件或空目錄
find . -type f -empty # 查找空文件 find . -type d -empty # 查找空目錄
查找并修改權限
# 找到用戶為 www-data 且權限不為 640 的 .php 文件,改為 640
find /var/www -user www-data -name "*.php" ! -perm 640 -exec chmod 640 {} \;復雜排除
# 在當前目錄查找 .txt 文件,但排除 build/ 和 .git/ 目錄 find . \( -path ./build -o -path ./.git \) -prune -o -name "*.txt" -print
總結與最佳實踐
先預覽,后操作:在執行 -delete 或 rm 等破壞性操作前,先用 -print 或 -ls 查看結果。
注意路徑:理解 -exec 和 -execdir 的區別,在可能涉及安全或相對路徑時使用 -execdir。
處理特殊文件名:在編寫腳本或管道時,使用 -print0 | xargs -0。
利用 + 提升效率:當命令支持多個參數時(如 rm, tar, chmod),用 -exec ... + 替代 -exec ... \;。
時間是利器:-mtime, -mmin 在系統管理和日志輪轉中極其常用。
find 的選項遠不止這些,但掌握了以上內容,你已經能解決 95% 以上的文件查找和批量處理問題。使用 man find 可以查看完整的官方手冊。
上一篇:Linux系統命令:配置介紹及修改配置
