01 一起來認識 find!
在 Linux 系統,find 毫無疑問是最強的檔案查找工具,find 一般會與其他命令結合,將查找到的結果作為引數傳入到后置命令中,進行洗掉、統計、復制遷移等操作,
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 還有其他引數;-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 #使用基本格式
- 第一個引數,'.' 代表當前目錄,如果是其他目錄,可以輸入絕對目錄和相對目錄位置;
- 第二個引數分兩部分,前面字母a、c、m分別代表訪問、變更、修改,后面time為日期,min為分鐘,注意只能以這兩個作為單位;
- 第三個引數為量,其中不帶符號表示符合該數量的,帶-表示符合該數量以后的,帶+表示符合該數量以前的,
??引數說明:
- atime:訪問時間(access time),指的是檔案最后被讀取的時間,可以使用touch命令更改為當前時間;
- ctime:變更時間(change time),指的是檔案本身最后被變更的時間,變更動作可以使chmod、chgrp、mv等等;
- mtime:修改時間(modify time),指的是檔案內容最后被修改的時間,修改動作可以使echo重定向、vi等等;
??一些使用示例:
- find . -type f -mtime -30 #查找當前目錄下30天之內修改過的檔案;
- find /var/log/ -mtime +30 -name '*.log' # 查找指定目錄/var/log/ 下30天以前被修改的log型別檔案;
- find /etc -maxdepth 1 ! -type l -mtime -30 #查找/etc 第一層目錄下不是符號鏈接檔案的檔案,并在30天內被修改過,-maxdepth :指定目錄層級,-maxdepth 1代表第1層,-maxdepth 2代表延伸到第二層;
04 find 組合命令洗掉檔案的三種方法
【場景案例】
用wc -l來統計下log數量,再進行洗掉,
find . -name '*.log' -mtime +30 | wc -l #從當前目錄下開始搜索30天之前的log檔案,并統計數量, "|": 管道符,將前面查到的資料作為輸入源給后面的命令;
【第一種洗掉方式:-exec】
find . -name '*.log' -mtime +30 -exec rm {} ; #查找當前目錄下30天以前的log檔案,使用-exec加rm將其洗掉;exec命令以分號結束';',該分號前面要放反斜杠轉義 ,
【第二種洗掉方式:-ok】
find . -name '*.log' -mtime +30 -ok rm {} ; #查找當前目錄下30天以前的log檔案,-ok : 詢問洗掉,y洗掉,n不洗掉,回車默認不洗掉;命令以分號結束';', 該分號前面要放反斜杠轉義 ,
【第三種洗掉方式:xargs】
find . -name '*.log' -mtime +30 -print0 | xargs -0 rm -f # xargs : 命令傳遞引數過濾器,與管道符 "|" 一同使用,將前面的命令傳遞給后面的命令使用;
05 find 與xargs 組合使用
- xargs 識別字符段的標識是空格或者換行符,若一個檔案名里有空格或者換行符,xargs 就會把它識別成兩個字串,就會出錯,這時就需要-print0和-0,
- find -print0 表示在 find 的每一個結果之后加一個NULL字符,而不是默認加一個換行符,find 的默認在每一個結果后加一個 '\n',所以輸出結果是一行一行的,當使用了-print0之后,就變成一行了,
- xargs -0 表示 xargs 用 NULL 來作為分隔符,這樣前后搭配就不會出現空格和換行符的錯誤,NULL做分隔符,是因為一般編程語言把NULL作為字串結束的標志,所以檔案名不可能以NULL結尾,
??使用案例:
- 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天前的所有log檔案移動到 /logback 檔案夾下,xargs -i + {},將前面查找到的檔案都作為引數給mv命令執行;
06 find下xargs與-exec的區別
??區別一:
- -exec,是將查找到的結果檔案名逐個傳遞給后面的命令執行,檔案多會導致效率低;
- xargs,則是一次性傳遞,效率較高,并可使用-n引數控制傳遞檔案個數,
??區別二:
- -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 小結
find 命令是查找檔案神器,可按檔案名、型別查找過濾;按時間范圍查找過濾;同時組合其他命令使用,可大大提高操作效率,
「不甩鍋的碼農」原創,轉載請注明來源,未經授權禁止商業用途!同名 GZH 請關注!
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/422977.html
標籤:其他
