2.3.2 查找文件我最強:find
2.3.2.1 find查找常用命令示例
find / -name 'wfy.txt'
# 從根目錄下開始查找文件wfy.txt
find . -name '*fy.txt'
# 當前目錄下,查找fy.txt后綴的文件
# “.”表示當前目錄,"*"表示任意長度字符
find / -type f -size +500M
# 從根目錄開始查找,500M以上文件
# / :根目錄
# . : 當前目錄
# -type f: f為普通文件類型,f改為d則是目錄文件,l則是符號鏈接文件,-type 還有其他參數,不在這里一一列舉
# -size +500M :500MB以上
# 一般磁盤空間不夠,刪除垃圾文件時會使用到此命令
find . -type f -size +1k
# 查找當前文件夾下超過1k的文件,注意k是小寫。
find . -type f -mtime -30
# 查找當前目錄下30天之內修改過的文件
# -mtime:代表修改時間,最常用,類似參數有-atime、-ctime
# -atime:代表訪問時間,查看過就算
# -ctime:文件狀態改變時間
# -30:代表30天以內,30為n,數字自己填寫
# +30:30天以前
# 30:距今第30天
find /var/log/ -mtime +30 -name '*.log'
# 查找指定目錄/var/log/ 下30天以前的log文件
find /etc ! -type f
# 查找 /etc 目錄下不是普通文件的 文件
# "!":感嘆號,取反
find /etc ! -type l -mtime -30
# 查找/etc 目錄下不是符號鏈接文件,並在30天內被修改過的文件
find /etc -maxdepth 1 ! -type l -mtime -30
# 查找/etc 第一層目錄下不是符號鏈接文件的文件,並在30天內被修改過
# -maxdepth : 前面du學過,指定目錄層級,-maxdepth 1代表第1層,-maxdepth 2代表延伸到第二層
-maxdepth 可能有點不好理解,所以截了個示例圖

2.3.2.2 使用find 組合命令:統計與刪除
基本常用的find命令都已經講完了,再說下運維中可能常用的一個組合命令,利用find刪除N天以前的文件或日志。
先用wc -l來統計下log數量,再刪除看看
find / -name '*.log' -mtime +300 | wc -l
# 從根目錄下開始搜索300天之前的log文件,並統計數量
# “|”:管道符,將前面查到的數據作為輸入源給后面的命令

第一種刪除方式:-exec
find / -name '*.log' -mtime +300 -exec rm {} \;
# 查找30天以前的log文件,使用-exec加rm將其刪除
# 再使用上面的命令重新查看一次
find / -name '*.log' -mtime +300 | wc -l

第二種刪除方式:-ok
find / -name '*.log' -mtime +200 -ok rm {} \;
# -ok : 詢問刪除,y刪除,n不刪除,回車默認不刪除


第三種刪除方式:xargs
依次執行查看結果
find / -name '*.log' -mtime +100 | wc -l
find / -name '*.log' -mtime +100 | xargs rm -f
# xargs : 命令傳遞參數過濾器,與管道符“|”一同使用,將前面的命令傳遞給后面的命令使用
find / -name '*.log' -mtime +100 | wc -l

2.3.2.3 find與xargs的組合使用
對於50天前的log文件進行詳情查看
find / -name '*.log' -mtime +50 | xargs ls -l
# 利用xargs + ls -l 命令來進行文件的詳細屬性查看

移除50天前的文件
mkdir /logback
# 創建根目錄下的 /logback文件夾
find / -name '*.log' -mtime +50 | xargs -i mv {} /logback
# 將50天前的所有log文件移動到 /logback 文件夾下
# xargs -i + {},將前面查找到的文件都作為參數給mv命令執行
ls -l /logback
# 查看 /logback 下所有文件詳情

2.3.2.4 find下xargs與exec的區別
區別一:
-exec,是將查找到的結果文件名逐個傳遞給后面的命令執行,文件多會導致效率低;
xargs,則是一次性傳遞,效率較高,並可使用-n參數控制傳遞文件個數。
區別二:
-exec,文件名有空格等特殊字符也照常處理;
xargs,處理特殊的文件名(例如文件名有空格)需要采用特殊的處理方式(find . -name "*edu" -pringt0| xargs -0 ls -l)
驗證區別一,示例如下:
find /logback -name '*.log' -exec echo yaomaomao {} \;
find /logback -name '*.log' | xargs echo yaomaomao

可以看到使用-exec每次獲得一個文件輸出一次,xargs則只輸出了一行。
xargs還可以用-n參數控制每次輸出的文件個數
find /logback -name '*.log' | xargs -n5 echo yaomaomao

可以看到,每行輸出5個參數(文件名),不足的行輸出剩下的。
驗證區別二,示例如下:
touch yaomaomao.txt;touch "yaomaomao centOS 7";ll yaomaomao*
# 小技巧:使用“;”分號可以一次性執行多個命令
# 注意:查看和創建帶有空格的文件時,使用引號括起來

find . -name "yaomaomao*" -exec ls -lh {} \;
# 正常查找出來
find . -name "yaomaomao*" | xargs ls -lh
# 可以看到使用此命令報找不到那個文件或目錄
find . -name "yaomaomao*" -print0 | xargs -0 ls -lh
# 正常查找

其實find還有很多強大的功能,截兩張圖大家就知道了


這本書就是我開頭推薦的《核心系統命令實戰》。
公眾號注冊的比較晚,沒有評論功能,所以一般用來發長文。
知識星球相當於技術朋友圈,有問題大家可以提問,討論。
歡迎關注我的公眾號:姚毛毛的博客

歡迎加入我的知識星球,目前免費哦。
知識星球:姚毛毛的私密花園
公眾號注冊的比較晚,沒有評論功能,所以一般用來發長文。
知識星球相當於技術朋友圈,有問題大家可以提問,討論。
歡迎關注我的公眾號:姚毛毛的博客

歡迎加入我的知識星球,目前免費哦。
知識星球:姚毛毛的私密花園
![知識星球]
