2021-08-13
1. 命令簡介
find 命令用來在指定目錄下查找文件。任何位於參數之前的字符串都將被視為欲查找的目錄名。如果使用該命令時,不設置任何參數,則 find 命令將在當前目錄下查找子目錄與文件。並且將查找到的子目錄和文件全部進行顯示。
# 語法 find path -option [-print] [-exec -ok |xargs |grep] [command {} \;]
# 參數 1) path 要查找的目錄路徑
~ 表示 $HOME 目錄
. 表示當前目錄
/ 表示根目錄
2) print 表示將結果輸出到標准輸出 3) exec 對匹配的文件執行該參數所給出的 shell 命令
格式 command {} \;
注意 {}與\;之間有空格
4) ok 與 exec 作用相同
區別: ok 在執行命令之前,都會給出提示,讓用戶確認是否執行
exec 不會
5) |xargs 與exec作用相同 ,起承接作用
區別: |xargs 主要用於承接刪除操作 -exec 什么操作都可用,如復制、移動、重命名等
6) options 表示查找方式
常用的選項: -name filename 查找名為 filename 的文件,* 表示該文件夾下所有的文件 -perm 按執行權限來查找 -user username 按文件屬主來查找 -group groupname 按組來查找 -mtime -n/+n 按文件更改時間來查找文件,-n 指 n 天之內;+n 指 n 天之前 -atime -n/+n 按文件訪問時間來查找文件,-n 指 n 天之內;+n 指 n 天之前 -ctime -n/+n 按文件創建時間來查找文件,-n 指 n 天之內;+n 指 n 天之前 -nogroup 查無有效屬組的文件,即文件的屬組在 /etc/groups 中不存在 -nouser 查無有效屬主的文件,即文件的屬主在 /etc/passwd 中不存 -type b/d/c/p/l/f 查是塊設備、目錄、字符設備、管道、符號鏈接、普通文件 -size n[c] 查長度為 n 塊[或 n 字節]的文件 -mount 查文件時不跨越文件系統 mount 點 -follow 如果遇到符號鏈接文件,就跟蹤鏈接所指的文件 -prune 忽略某個目錄
2. find 命令 的三個參數
2.1 使用命令 stat 先看下文件或者目錄的信息
# 查看 test/ 的信息 stat test/

從圖中可以看到關於時間信息有三個:
1) 最近訪問時間 access time (-atime)
2) 最近更改時間 modify time(-mtime)
3) 最近狀態改動時間 change time(-ctime);
也看到了 Birth 創建時間一項為空,說明 Linux 系統下是無法查看文件的創建時間的。
-atime, -ctime 和 -mtime 參數含義 atime: 代表最近一次訪問文件的時間,顯示一個文件的內容或者運行一個 shell 腳本會更新文件的 atime。可用 ls -lu 命令查看。 在 kernel 2.6.30 之前,文件系統默認會及時的更新 atime;此后版本,只有發生以下三種情況之一才會更新 atime。 1. 將分區 mount 的掛載的時候指定采用非 relatime 方式 2. atime 小於 ctime或者小於 mtime的時候 3. 本次的 access time 和上次的 atime 超過 24 個小時 mtime: 代表最近一次文件內容被修改的時間。可用 ls -l 命令查看。 ctime: 代表最近一次文件狀態的改變時間,是 status change time,在寫入文件、更改所有者、權限或鏈接設置時隨 Inode 的內容更改而更改, 文件狀態最后一次被改變的時間。可用 ls -lc 命令查看。
2.2 -mtime 參數詳解
在 linux 環境中經常會用到 find -mtime 來找某時間點之前的文件,並在此基礎上進行處理(如定期刪除過期文件)
如何更好的理解find -mtime n/+n/-n,這里小結下: -mtime n n 為數字,意思為在 n 天之前的 “一天之內” 被更改過內容的文件 -mtime +n 列出在 n 天之前(不含 n 天本身)被更改過內容的文件名 -mtime -n 列出在 n 天之內(包含 n 天本身)被更改過內容的文件名
例如:
-mtime 0 0 代表目前時間,所以,從現在開始到 24h 前,有改動過內容的文件都會被列出來
-mtime 1 表示文件修改時間距離今天為 1 天的文件,即距離當前時間 1 天(24h-48h)的文件


-mtime +1 表示文件修改時間為大於 1 天的文件,即距離當前時間 2 天(48h)之外的文件
-mtime -1 表示文件修改時間為小於 1 天的文件,即距離當前時間 1 天(24h)之內的文件
為什么 -mtime +1 表示文件修改時間為大於 1 天的文件,即距離當前時間 48h 之外的文件,而不是 24h 之外的呢?
因為 n 只能是整數,而 +1 即表示 n+1 ,故 -mtime +1 是修改時間大於兩天的文件。
例: find /test/data/ -mtime +1 -name '*' -exec rm -rf {} \;
該命令本意是將所有修改時間大於一天的文件都刪除,但是因為 n 需為整數,並且 +1 代表大於 1,因此保留了兩天的文件
3. 實例
# 將當前目錄及其子目錄下所有文件后綴為 .c 的文件列出來: find . -name "*.txt"

# 將當前目錄及其子目錄中的所有文件列出: find . -type f

# 將當前目錄及其子目錄下所有最近 20 天內更新過的文件列出: find . -ctime -1

# 查找 test/ 目錄中更改時間在 3 日以前的普通文件,並在刪除之前詢問它們: find test/ -type f -mtime +3 -ok rm {} \;

# 查找當前目錄中文件屬主具有讀、寫權限,並且文件所屬組的用戶和其他用戶具有讀權限的文件: find . -type f -perm 644 -exec ls -l {} \;

# 查找家目錄中中所有文件長度為 0 的普通文件,並列出它們的完整路徑: find . -type f -size 0 -exec ls -l {} \;

