Linux centos7 find 命令


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 {} \;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM