find
find 用來在指定目錄下查找文件。任何位於參數之前的字符串都將被視為欲查找的目錄名。如果使用該命令時,不設置任何參數,則 find 命令將在當前目錄下查找子目錄與文件。並且將查找到的子目錄和文件全部進行顯示。
語法
find path -option [ -print ] [ -exec -ok command ] {} \;
上面的 find的常用形式可以簡化為:
find [path...] [expression]
-
path:所查找的目錄路徑。例如,用.來表示當前目錄,用/來表示系統根目錄
-
expression:可以分為 “-options [-print -exec -ok ...]”
-
-options,指定find命令的常用選項,下節詳細介紹-print,find命令將匹配的文件輸出到標准輸出-exec,find命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式為'command' { } \;,注意{ }和\;之間的空格
find ./ -size 0 -exec rm {} \;刪除文件大小為零的文件 (還可以以這樣做:rm -i find ./ -size 0或find ./ -size 0 | xargs rm -f &)- 為了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec選項中:
find . -type f -exec ls -l { } \;
在/logs目錄中查找更改時間在5日以前的文件並刪除它們:find /logs -type f -mtime +5 -exec rm { } \; -ok,和-exec的作用相同,只不過以一種更為安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。
find . -name "*.conf" -mtime +5 -ok rm { } \;在當前目錄中查找所有文件名以.conf結尾、更改時間在5日以上的文件,並刪除它們,只不過在刪除之前先給出提示
參數
expression 中可用選項非常之多
- -mount, -xdev : 只檢查和指定目錄在同一個文件系統下的文件,避免列出其它文件系統中的文件
- -amin n : 在過去 n 分鍾內被讀取過
- -anewer file : 比文件 file 更晚被讀取過的文件
- -atime n : 在過去n天內被讀取過的文件
- -cmin n : 在過去 n 分鍾內被修改過
- -cnewer file :比文件 file 更新的文件
- -ctime n : 在過去n天內被修改過的文件
- -empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名稱是 name
- -ipath p, -path p : 路徑名稱符合 p 的文件,ipath 會忽略大小寫
- -name name, -iname name : 文件名稱符合 name 的文件。iname 會忽略大小寫
- -size n : 文件大小 是 n 單位,b 代表 512 位元組的區塊,c 表示字元數,k 表示 kilo bytes,w 是二個位元組。
- -type c : 文件類型是 c 的文件
| 文件類型 | 說明 |
|---|---|
| d | 目錄 |
| c | 字符設備 |
| b | 塊設備 |
| p | 管道 |
| f | 普通文件 |
| l | 符號鏈接 |
| s | 套接字文件 |
實例
(1)根據文件名查找
-name //根據文件名查找(精確查找)
-iname //根據文件名查找,但是不區分大小寫
這里另外介紹下文件名通配符的知識
*表示通配任意的字符
find /etc -name "*passwd"
?表示通配任意的單個字符
find /etc -name "passwd?"
[ ] 表示通配括號里面的任意一個字符
find /etc -name "[ab].sh"
(2)根據文件所屬用戶和組來查找文件
-user //根據屬主來查找文件
-group //根據屬組來查找文件
(3)根據 uid 和 gid來查找用戶
find /tmp -uid 500 //查找uid是500 的文件
find /tmp -gid 1000 // 查找gid是1000的文件
(4)-a and -o and –not的使用
ps:有用
-a 連接兩個不同的條件(兩個條件必須同時滿足)
-o 連接兩個不同的條件(兩個條件滿足其一即可)
-not 對條件取反的
find /tmp -name "*.sh" -a -user root
find /tmp -not -user root
(5)根據文件時間戳的相關屬性來查找文件
可以使用stat命令來查看一個文件的時間信息
如下:
stat /etc/passwd
-atime
-mtime
-ctime
-amin
-mmin
-cmin
所以這里atime, mtime, ctime就是分別對應的 “最近一次訪問時間” “最近一次內容修改時間” “最近一次屬性修改時間”,這里的atime的單位指的是“天”,amin的單位是分鍾
find /tmp –atime +5 //表示查找在五天內沒有訪問過的文件(也就是5天前天沒訪問的文件)
find /tmp -atime -5 //表示查找在五天內訪問過的文件
ps:在清理日志的時候,一般使用的是——最近一次內容修改的時間
find -mtime +30 -name "*[0-9]*" -exec rm {} \;
(6)根據文件類型來查找文件 -type
f // 普通文件
d //目錄文件
l //鏈接文件
b //塊設備文件
c //字符設備文件
p //管道文件
s //socket文件
find /tmp -type s
(7)根據大小來查找文件 -size
find /tmp -size 2M //查找在/tmp 目錄下等於2M的文件
find /tmp -size +2M //查找在/tmp 目錄下大於2M的文件
find /tmp -size -2M //查找在/tmp 目錄下小於2M的文件
(8)根據文件權限查找文件 -perm
find /tmp -perm 755 //查找在/tmp目錄下權限是755的文件
find /tmp -perm +222 //表示只要有一類用戶(屬主,屬組,其他)的匹配寫權限就行
find /tmp -perm -222 //表示必須所有類別用戶都滿足有寫權限
(9)-nouser and -nogroup
find / -nogroup –a –nouser //在整個系統中查找既沒有屬主又沒有屬組的文件(這樣的文件通常是很危險的,作為系統工程師的我們應該及時清除掉)
查找完執行的action
-print //默認情況下的動作
-ls //查找到后用ls 顯示出來
-ok [commend] //查找后執行命令的時候詢問用戶是否要執行
-exec [commend] //查找后執行命令的時候不詢問用戶,直接執行
find /tmp -name "*.sh" -exec chmod u+x {} \;
這里要注意{}的使用:替代查找到的文件
find /tmp "*.sh" -exec cp {} {}.old \;
刪除查找到的超過30天沒有訪問過文件
find /tmp -atime +30 –exec rm –rf {} \;
也可以使用xargs來對查找到的文件進一步操作
find /tmp -name "*.old" | xargs chmod 700
案例詳細說明
- 刪除文件命令
find 對應目錄 -mtime +天數 -name "文件名" -exec rm -rf {} \;
- 實例命令
find /opt/soft/log/ -mtime +30 -name "*.log" -exec rm -rf {} \;
- 說明
將 /opt/soft/log/ 目錄下所有30天前帶".log"的文件刪除。具體參數說明如下:
-
find linux的查找命令,用戶查找指定條件的文件;
-
/opt/soft/log/:想要進行清理的任意目錄;
-
-mtime:標准語句寫法;
-
+30:查找30天前的文件,這里用數字代表天數;
-
"*.log":希望查找的文件名正則表達式,"*.jpg"表示查找擴展名為jpg的所有文件,
"*"表示查找所有文件,這個可以靈活運用,舉一反三; -
-exec:固定寫法;
-
rm -rf:強制刪除文件,包括目錄;
-
{} ; :固定寫法,一對
大括號+空格+\+;
附錄
