01 一起來認識 find!
在 Linux 系統(tǒng)闷盔,find 毫無疑問是最強的文件查找工具倦西。find 一般會與其他命令結(jié)合能真,將查找到的結(jié)果作為參數(shù)傳入到后置命令中,進行刪除、統(tǒng)計粉铐、復制遷移等操作疼约。
02 find 文件名、類型查找過濾
- find / -name 'hello.txt' #從根目錄下開始查找文件 hello.txt蝙泼;
- find . -iname 'hello.txt' #從當前目錄下開始查找文件 hello.txt程剥,-iname 會忽略大小寫;
- find . -name '*hello.txt' #當前目錄下汤踏,查找目標名稱后綴為 "hello.txt" 的文件织鲸;
- find / -type f -size +500M #從根目錄開始查找,500M以上文件溪胶;-type f: f為普通文件類型搂擦,f 改為 d 則是目錄文件,l 則是符號鏈接文件哗脖,-type 還有其他參數(shù)盾饮;-size +500M :500MB以上 。一般磁盤空間不夠懒熙,刪除垃圾文件時會使用到此命令丘损;
- find . -type f -size +1k #查找當前文件夾下超過1k的文件,注意k是小寫工扎;
- find /etc ! -type f #查找 /etc 目錄下不是普通文件的文件徘钥,"!":感嘆號,取反肢娘;
03 find 時間范圍查找過濾
find . {-atime/-ctime/-mtime/-amin/-cmin/-mmin} [-/+]num #使用基本格式
- 第一個參數(shù)呈础,'.' 代表當前目錄,如果是其他目錄橱健,可以輸入絕對目錄和相對目錄位置而钞;
- 第二個參數(shù)分兩部分,前面字母a拘荡、c臼节、m分別代表訪問、變更珊皿、修改网缝,后面time為日期,min為分鐘蟋定,注意只能以這兩個作為單位粉臊;
- 第三個參數(shù)為量,其中不帶符號表示符合該數(shù)量的驶兜,帶-表示符合該數(shù)量以后的扼仲,帶+表示符合該數(shù)量以前的远寸。
??參數(shù)說明:
- atime:訪問時間(access time),指的是文件最后被讀取的時間屠凶,可以使用touch命令更改為當前時間驰后;
- ctime:變更時間(change time),指的是文件本身最后被變更的時間阅畴,變更動作可以使chmod、chgrp迅耘、mv等等贱枣;
- mtime:修改時間(modify time),指的是文件內(nèi)容最后被修改的時間颤专,修改動作可以使echo重定向纽哥、vi等等;
??一些使用示例:
- find . -type f -mtime -30 #查找當前目錄下30天之內(nèi)修改過的文件栖秕;
- find /var/log/ -mtime +30 -name '*.log' # 查找指定目錄/var/log/ 下30天以前被修改的log類型文件春塌;
- find /etc -maxdepth 1 ! -type l -mtime -30 #查找/etc 第一層目錄下不是符號鏈接文件的文件,并在30天內(nèi)被修改過簇捍,-maxdepth :指定目錄層級只壳,-maxdepth 1代表第1層,-maxdepth 2代表延伸到第二層暑塑;
04 find 組合命令刪除文件的三種方法
【場景案例】
用wc -l來統(tǒng)計下log數(shù)量吼句,再進行刪除。
find . -name '*.log' -mtime +30 | wc -l #從當前目錄下開始搜索30天之前的log文件事格,并統(tǒng)計數(shù)量惕艳, "|": 管道符,將前面查到的數(shù)據(jù)作為輸入源給后面的命令驹愚;
【第一種刪除方式:-exec】
find . -name '*.log' -mtime +30 -exec rm {} ; #查找當前目錄下30天以前的log文件,使用-exec加rm將其刪除;exec命令以分號結(jié)束';'把跨,該分號前面要放反斜杠轉(zhuǎn)義 们拙。
【第二種刪除方式:-ok】
find . -name '*.log' -mtime +30 -ok rm {} ; #查找當前目錄下30天以前的log文件,-ok : 詢問刪除劫瞳,y刪除棠耕,n不刪除,回車默認不刪除柠新;命令以分號結(jié)束';'窍荧, 該分號前面要放反斜杠轉(zhuǎn)義 。
【第三種刪除方式:xargs】
find . -name '*.log' -mtime +30 -print0 | xargs -0 rm -f # xargs : 命令傳遞參數(shù)過濾器恨憎,與管道符 "|" 一同使用蕊退,將前面的命令傳遞給后面的命令使用郊楣;
05 find 與xargs 組合使用
- xargs 識別字符段的標識是空格或者換行符,若一個文件名里有空格或者換行符瓤荔,xargs 就會把它識別成兩個字符串净蚤,就會出錯。這時就需要-print0和-0输硝。
- find -print0 表示在 find 的每一個結(jié)果之后加一個NULL字符今瀑,而不是默認加一個換行符。find 的默認在每一個結(jié)果后加一個 '\n'点把,所以輸出結(jié)果是一行一行的橘荠。當使用了-print0之后,就變成一行了郎逃。
- xargs -0 表示 xargs 用 NULL 來作為分隔符哥童。這樣前后搭配就不會出現(xiàn)空格和換行符的錯誤。NULL做分隔符褒翰,是因為一般編程語言把NULL作為字符串結(jié)束的標志贮懈,所以文件名不可能以NULL結(jié)尾。
??使用案例:
- find . -name '*.log' -mtime +10 -print0 | xargs -0 rm -f #保險的方式刪除优训,推薦這樣使用
- find / -name '*.log' -mtime +30 | xargs ls -l #對于30天前的log文件進行詳情查看朵你,利用xargs + ls -l 命令來進行文件的詳細屬性查看;
- find / -name '*.log' -mtime +30 | xargs -i mv {} /logback #將30天前的所有l(wèi)og文件移動到 /logback 文件夾下揣非,xargs -i + {}撬呢,將前面查找到的文件都作為參數(shù)給mv命令執(zhí)行;
06 find下xargs與-exec的區(qū)別
??區(qū)別一:
- -exec妆兑,是將查找到的結(jié)果文件名逐個傳遞給后面的命令執(zhí)行魂拦,文件多會導致效率低;
- xargs搁嗓,則是一次性傳遞芯勘,效率較高,并可使用-n參數(shù)控制傳遞文件個數(shù)腺逛。
??區(qū)別二:
- -exec荷愕,文件名有空格等特殊字符也照常處理;
- xargs棍矛,處理特殊的文件名(例如文件名有空格)需要采用特殊的處理方式(find . -name "*.log" -print0| xargs -0 ls -l)安疗。
07 一個常用實踐組合命令
【場景】
查找超過500M大小文件,并顯示查找出來文件的具體大小够委,且按照大小排序荐类。
【命令示例】
- find . -type f -size +500M -print0 | xargs -0 du -h | sort -nr
- find . -name '*.log' -size +500M -print0 | xargs -0 du -h | sort -nr
08 小結(jié)
find 命令是查找文件神器,可按文件名茁帽、類型查找過濾玉罐;按時間范圍查找過濾屈嗤;同時組合其他命令使用,可大大提高操作效率吊输。
「不甩鍋的碼農(nóng)」原創(chuàng)饶号,轉(zhuǎn)載請注明來源,未經(jīng)授權(quán)禁止商業(yè)用途季蚂!同名 GZH 請關(guān)注茫船!