find命令
find命令用來在指定目錄下查找文件肥橙。任何位于參數(shù)之前的字符串都將被視為欲查找的目錄名溪椎。如果使用該命令時葫掉,不設(shè)置任何參數(shù)拓哺,則find命令將在當前目錄下查找子目錄與文件。并且將查找到的子目錄和文件全部進行顯示扎运。
語法
find (選項) (參數(shù))
選項
- 常用參數(shù)
- -name<范本樣式>:指定字符串作為尋找文件或目錄的范本樣式瑟曲;
- -iname<范本樣式>:此參數(shù)的效果和指定“-name”參數(shù)類似,但忽略字符大小寫的差別豪治;
- -type<文件類型>:只尋找符合指定的文件類型的文件洞拨;
- -size<文件大小>:查找符合指定的文件大小的文件;
- -perm<權(quán)限數(shù)值>:查找符合指定的權(quán)限數(shù)值的文件或目錄负拟;
- -fstype<文件系統(tǒng)類型>:只尋找該文件系統(tǒng)類型下的文件或目錄烦衣;
- -mtime<24小時數(shù)>:查找在指定時間曾被更改過的文件或目錄,單位以24小時計算;
- -mmin<分鐘>:查找在指定時間曾被更改過的文件或目錄花吟,單位以分鐘計算秸歧;
- -amin<分鐘>:查找在指定時間曾被存取過的文件或目錄,單位以分鐘計算衅澈;
- -atime<24小時數(shù)>:查找在指定時間曾被存取過的文件或目錄键菱,單位以24小時計算;
- -ctime<24小時數(shù)>:查找在指定時間之時被更改的文件或目錄今布,單位以24小時計算经备;
- -cmin<分鐘>:查找在指定時間之時被更改過的文件或目錄;
- -print:假設(shè)find指令的回傳值為Ture部默,就將文件或目錄名稱列出到標準輸出侵蒙。格式為每列一個名稱,每個名稱前皆有“./”字符串甩牺;
- -fprint<列表文件>:此參數(shù)的效果和指定“-print”參數(shù)類似蘑志,但會把結(jié)果保存成指定的列表文件;
- -printf<輸出格式>:假設(shè)find指令的回傳值為Ture贬派,就將文件或目錄名稱列出到標準輸出急但。格式可以自行指定;
- -fprintf<列表文件><輸出格式>:此參數(shù)的效果和指定“-printf”參數(shù)類似搞乏,但會把結(jié)果保存成指定的列表文件波桩;
- -exec<執(zhí)行指令>:假設(shè)find指令的回傳值為True,就執(zhí)行該指令请敦;
- -ok<執(zhí)行指令>:此參數(shù)的效果和指定“-exec”類似镐躲,但在執(zhí)行指令之前會先詢問用戶,若回答“y”或“Y”侍筛,則放棄執(zhí)行命令萤皂;
- 其他參數(shù)
- -anewer<參考文件或目錄>:查找其存取時間較指定文件或目錄的存取時間更接近現(xiàn)在的文件或目錄;
- -cnewer<參考文件或目錄>查找其更改時間較指定文件或目錄的更改時間更接近現(xiàn)在的文件或目錄匣椰;
- -daystart:從本日開始計算時間裆熙;
- -depth:從指定目錄下最深層的子目錄開始查找;
- -expty:尋找文件大小為0 Byte的文件禽笑,或目錄下沒有任何子目錄或文件的空目錄入录;
- -false:將find指令的回傳值皆設(shè)為False;
- -fls<列表文件>:此參數(shù)的效果和指定“-ls”參數(shù)類似佳镜,但會把結(jié)果保存為指定的列表文件僚稿;
- -follow:排除符號連接;
- -fprint0<列表文件>:此參數(shù)的效果和指定“-print0”參數(shù)類似蟀伸,但會把結(jié)果保存成指定的列表文件蚀同;
- -gid<群組識別碼>:查找符合指定之群組識別碼的文件或目錄缅刽;
- -group<群組名稱>:查找符合指定之群組名稱的文件或目錄;
- -help或——help:在線幫助唤崭;
- -ilname<范本樣式>:此參數(shù)的效果和指定“-lname”參數(shù)類似拷恨,但忽略字符大小寫的差別;
- -inum<inode編號>:查找符合指定的inode編號的文件或目錄谢肾;
- -ipath<范本樣式>:此參數(shù)的效果和指定“-path”參數(shù)類似腕侄,但忽略字符大小寫的差別;
- -iregex<范本樣式>:此參數(shù)的效果和指定“-regexe”參數(shù)類似芦疏,但忽略字符大小寫的差別冕杠;
- -links<連接數(shù)目>:查找符合指定的硬連接數(shù)目的文件或目錄;
- -iname<范本樣式>:指定字符串作為尋找符號連接的范本樣式酸茴;
- -ls:假設(shè)find指令的回傳值為Ture分预,就將文件或目錄名稱列出到標準輸出;
- -maxdepth<目錄層級>:設(shè)置最大目錄層級薪捍;
- -mindepth<目錄層級>:設(shè)置最小目錄層級笼痹;
- -mount:此參數(shù)的效果和指定“-xdev”相同;
- -newer<參考文件或目錄>:查找其更改時間較指定文件或目錄的更改時間更接近現(xiàn)在的文件或目錄酪穿;
- -nogroup:找出不屬于本地主機群組識別碼的文件或目錄凳干;
- -noleaf:不去考慮目錄至少需擁有兩個硬連接存在;
- -nouser:找出不屬于本地主機用戶識別碼的文件或目錄被济;
- -path<范本樣式>:指定字符串作為尋找目錄的范本樣式救赐;
- -print0:假設(shè)find指令的回傳值為Ture,就將文件或目錄名稱列出到標準輸出只磷。格式為全部的名稱皆在同一行经磅;
- -prune:不尋找字符串作為尋找文件或目錄的范本樣式;
- -regex<范本樣式>:指定字符串作為尋找文件或目錄的范本樣式;
- -true:將find指令的回傳值皆設(shè)為True钮追;
- -uid<用戶識別碼>:查找符合指定的用戶識別碼的文件或目錄预厌;
- -used<日數(shù)>:查找文件或目錄被更改之后在指定時間曾被存取過的文件或目錄,單位以日計算元媚;
- -user<擁有者名稱>:查找符和指定的擁有者名稱的文件或目錄轧叽;
- -version或——version:顯示版本信息;
- -xdev:將范圍局限在先行的文件系統(tǒng)中惠毁;
- -xtype<文件類型>:此參數(shù)的效果和指定“-type”參數(shù)類似犹芹,差別在于它針對符號連接檢查崎页。</pre>
案例
- 案例1
列出當前目錄及子目錄下所有文件和文件夾
find .
- 案例2
在/home目錄下查找以.txt結(jié)尾的文件名
find /home -name "*.txt"
- 案例3
同上鞠绰,但忽略大小寫
find /home -iname "*.txt"
- 案例4:
當前目錄及子目錄下查找所有以.txt和.pdf結(jié)尾的文件
find . \( -name "*.txt" -o -name "*.pdf" \)
或
find . -name "*.txt" -o -name "*.pdf"
- 案例5
匹配文件路徑或者文件
find /usr/ -path "*local*"
- 案例6
基于正則表達式匹配文件路徑
find . -regex ".*\(\.txt\|\.pdf\)$"
- 案例7
同上,但忽略大小寫
find . -iregex ".*\(\.txt\|\.pdf\)$"
否定參數(shù)
找出/home下不是以.txt結(jié)尾的文件
find /home ! -name "*.txt"
根據(jù)文件類型進行搜索
find . -type 類型參數(shù)
類型參數(shù)列表:
- f 普通文件
- l 符號連接
- d 目錄
- c 字符設(shè)備
- b 塊設(shè)備
- s 套接字
- p Fifo
基于目錄深度搜索
向下最大深度限制為3
find . -maxdepth 3 -type f
搜索出深度距離當前目錄至少2個子目錄的所有文件
find . -mindepth 2 -type f
根據(jù)文件時間戳進行搜索
find . -type f 時間戳
UNIX/Linux文件系統(tǒng)每個文件都有三種時間戳:
- 訪問時間(-atime/天飒焦,-amin/分鐘):用戶最近一次訪問時間蜈膨。
- 修改時間(-mtime/天屿笼,-mmin/分鐘):文件最后一次修改時間。
- 變化時間(-ctime/天翁巍,-cmin/分鐘):文件數(shù)據(jù)元(例如權(quán)限等)最后一次修改時間驴一。
搜索最近七天內(nèi)被訪問過的所有文件
find . -type f -atime -7
搜索恰好在七天前被訪問過的所有文件
find . -type f -atime 7
搜索訪問時間超過10分鐘的所有文件
find . -type f -amin +10
找出比file.log修改時間更長的所有文件
find . -type f -newer file.log
根據(jù)文件大小進行匹配
find . -type f -size 文件大小單元
文件大小單元:
- b —— 塊(512字節(jié))
- c —— 字節(jié)
- w —— 字(2字節(jié))
- k —— 千字節(jié)
- M —— 兆字節(jié)
-
G —— 吉字節(jié)
搜索大于10KB的文件
find . -type f -size +10k
搜索小于10KB的文件
find . -type f -size -10k
搜索等于10KB的文件
find . -type f -size 10k
刪除匹配文件
刪除當前目錄下所有.txt文件
find . -type f -name "*.txt" -delete
根據(jù)文件權(quán)限/所有權(quán)進行匹配
當前目錄下搜索出權(quán)限為777的文件
find . -type f -perm 777
找出當前目錄下權(quán)限不是644的php文件
find . -type f -name "*.php" ! -perm 644
找出當前目錄用戶tom擁有的所有文件
find . -type f -user tom
找出當前目錄用戶組sunk擁有的所有文件
find . -type f -group sunk
借助-exec選項與其他命令結(jié)合使用
找出當前目錄下所有root的文件,并把所有權(quán)更改為用戶tom
find .-type f -user root -exec chown tom {} \;
上例中灶壶,{} 用于與-exec選項結(jié)合使用來匹配所有文件肝断,然后會被替換為相應(yīng)的文件名。
找出自己家目錄下所有的.txt文件并刪除
find $HOME/. -name "*.txt" -ok rm {} \;
上例中驰凛,-ok和-exec行為一樣胸懈,不過它會給出提示,是否執(zhí)行相應(yīng)的操作恰响。
查找當前目錄下所有.txt文件并把他們拼接起來寫入到all.txt文件中
find . -type f -name "*.txt" -exec cat {} \;> all.txt
將30天前的.log文件移動到old目錄中
find . -type f -mtime +30 -name "*.log" -exec cp {} old \;
找出當前目錄下所有.txt文件并以“File:文件名”的形式打印出來
find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;
因為單行命令中-exec參數(shù)中無法使用多個命令趣钱,以下方法可以實現(xiàn)在-exec之后接受多條命令
-exec ./text.sh {} \;
搜索但跳出指定的目錄
查找當前目錄或者子目錄下所有.txt文件,但是跳過子目錄sk
find . -path "./sk" -prune -o -name "*.txt" -print
find其他技巧收集
要列出所有長度為零的文件
find . -empty
練習題
- 查找/var目錄屬主為root胚宦,且屬組為mail的所有文件
- 查找/usr目錄下不屬于root首有、bin或hadoop的所有文件
- 查找/etc目錄下最近一周內(nèi)其內(nèi)容修改過,且屬主不為root或hadoop的所有文件
- 查找當前系統(tǒng)上沒有屬主或?qū)俳M枢劝,且最近一周內(nèi)曾被訪問過的所有文件
- 查找/etc目錄下大于20K且類型為普通文件的所有文件
- 查找/etc目錄下所有用戶都沒有寫權(quán)限
- 查找/etc目錄下至少有一類用戶沒有執(zhí)行權(quán)限的文件
- 查找/etc/init.d目錄下井联,所有用戶都有執(zhí)行權(quán)限,且其它用戶擁有寫權(quán)限的文件
find /var -user root -group mail -ls
find /var \( -user root -a -group mail \) -ls
find /usr ! \( -user root -o -user bin -o -user jason \) -exec ls -l {} \;
find /etc ! \( -user root -o -user hadoop \) -mtime -7 -exec ls -l {} \;
find / -atime -7 -a \( -nouser -o -nogroup \) -ls
find /etc -type f -size +20k -exec ls -l {} \; |head -n 10
find /etc ! -perm /222 -exec ls -l {} \;
find /etc ! -perm -111 -exec ls -l {} \;
find /etc/init.d -perm -112 -exec ls -l {} \;
練習題
1.查找 /tmp 目錄下名字為 aming開頭的所有文件呈野。
find /tmp -name "aming*" #注意這里并不能使用 ^aming
2.查找指定 inode 的文件或目錄
find / -inum 141418
3.找出 tmp 目錄下的所有一級子目錄
find /tmp -maxdepth 1 -type d
在root目錄下及其最大兩層深度的子目錄中,查找 passwd 文件
find /root -maxdepth 3 -name passwd
在第二層和第四層子目錄之間查找 passwd 文件
find . -mindepth 3 -maxdepth 5 -name passwd
4.搜索tmp目錄下所屬組group1,所屬主user1的文件
find /tmp -type f -user user1 -group group1
5.搜索根目錄下的 1.txt 2.txt 和 a 目錄
find / -name 1.txt -o -name 2.txt -o -type d -name a
6. 搜索tmp目錄下以 a 開頭并且以 c 結(jié)尾的文件
find /tmp -name "a*" -a -name "*c" -type f
7. 搜索 tmp 目錄下,不是以 a 開頭,并且大小超過100M的文件
find /tmp -not -name "a*" -a -name "*txt" -size +100M -tyep f
8. 搜索 tmp 目錄下,修改時間一年內(nèi)的文件
find . -type f -mtime -365
9. 搜索目錄下,修改時間一年內(nèi),不是文件的其他類型
find . -not -type f -mtime -365
10.搜索目錄下,修改時間超過一年的并且大于100M的文件
find . -type f -not -mtime -365 -a -size +100M
11.列出tmp目錄下一年內(nèi)都沒有改變的文件
find /tmp -type f ! -mtime -365
12.找出 tmp 目錄下的所有的一級空目錄
find . -type d -empty
13.搜索tmp目錄下名稱包含*.txt的目錄,或者包含*.txt并且權(quán)限為777的文件或目錄
find /tmp -name *.txt -a /( -perm 777 -o -type d /) #-a and意思
14.查找所有的隱藏目錄
find . -type d -name ".*"
15.搜索當前目錄下10天以前的文件,或者權(quán)限為644的的文件和目錄
find . -type f -mtime +10 -o -perm 644
16.在 / 目錄下的 etc目錄及其子目錄下查找 passwd 文件
find /etc -name passwdfind / -path -path "/etc*" -name passwd/etc/passwd/etc/pam.d/passwd 在根目錄下的 etc 以及 tmp 目錄內(nèi)查找 passwd 文件cp /etc/passwd /tmpfind / /( -path "/etc*" -o -path "/tmp*" /) -name passwd
在所有名為 general 的目錄下查找 .stp 結(jié)尾的文件find / -path "*/general/*" -name "*.stp"
找到 usr 目錄下,并且在 applications 子目錄里面以 .cache 結(jié)尾的文件低矮。假設(shè)并不知道 applications 的絕對路徑,并且目錄是第 10 層甚至第 100 層目錄,只知道絕對路徑以 /usr/local 開頭方法一:find /usr/local -name applications -type d 在用上面找到的絕對路徑去執(zhí)行 find ....... -name "*.cache"方法二: find /usr/local -path "*share*" -name "*.cache"
NOTE: -path ".." ,表示 path 路徑里面包含指定的字符。
17.查找除 /etc 目錄及其子目錄下的,仍在根目錄的 passwd 文件
find / -path "/etc" -prune -o -name passwd -print
查找/tmp/ 目錄下所有文件(不包含目錄), 并且不包含目錄123
find /tmp/ -path "/tmp/123" -prune -o -type f -print-print -path -prune -o 固定格式,一個都不能少 ,表示排除指定的目錄或文件
查找/tmp/ 目錄下所有文件(不包含目錄), 并且不包含目錄123和目錄234和目錄345find /tmp/ /( -path "/tmp/123" -o -path "/tmp/234" -o -path "/tmp/345" /) -prune -o -type f -print注意,如果是查找目錄時,-path 后面的目錄名一定不要帶/ 如 寫成 -path "/tmp/123/" 就錯了,而查找文件時,帶/ 沒有問題被冒。
18.刪除tmp目錄下所有文件
find /tmp/ -type f |xargs rm
19.查找類型為 ext4 的文件
find . -fstype ext4
20.查找tmp目錄下包含abcde字母的文件,不區(qū)分大小
find /tmp -iname abcde
使用find重命名文件
21.用inode 16187430 編號重命名為 newtest
find -inum 16187430 -exec mv {} new-test-file-name /;
22.給tmp目錄下的所有文件增加.bak后綴
find /tmp/ -type f |xargs -i {} {}.bak-i
#把簽名列出的文件一個個的處理{} 表示一次一個對象,比如find出來很多行,每次處理一行,用{}代表這一行
23.找到具有組讀權(quán)限的文件和目錄
find . -perm -g=r -exec ls -l {} /;
#-g=r 會模糊匹配,只要含有 r 權(quán)限的都會列出來
24.找到具有組讀權(quán)限和寫權(quán)限的文件和目錄
find . -perm -g=r -a -perm -g=w -type f
25.搜索具有用戶讀寫可執(zhí)行權(quán)限的目錄
find . -perm -u=r -a -perm -u=w -a -perm -u=x -type f
26.找到對組用戶具有只讀權(quán)限的文件,
find -perm g=r -exec ls -l {} /;
#----r----- 1 root root 0 3月 31 21:50 ./1find -perm 040 -exec ls -l {} /;
27.列出/etc目錄及其子目錄下的5個最大的文件军掂。
find /etc -exec ls -s {} /; | sort -n -r | head -5
28.列出 /etc 目錄及其子目錄下5個最小的文件
find /etc -type f -exec ls -s {} /; | sort -n | head -5
29.列出 /etc 目錄及其子目錄下5個最小的文件,不包含 0 空文件
find /etc -not -empty -type f -exec ls -s {} /; | sort -n | head -5find /etc ! -empty
-type f -exec ls -s {} /; | sort -n | head -5
30.find 命令刪除大于100M的 .zip 文件
find / -type f -name "*.zip" -size +100M -exec rm -i {} /;
31.列出在1.txt修改之后修改的文件
find -newer 1.txt
32.列出在1.txt 和 test 之間修改的文件
find -newer 1.txt ! -newer test #該命令列出的文件,會包含 test 文件
33.列出在 2012.12.01 到 2012.12.31 修改的文件思路,手動創(chuàng)建兩個文件,文件目錄無所謂,修改時間
#touch -m -t 1212010000 1.txt
#touch -m -t 1212322359 2.txt
find / -newer 1.txt ! -newer 2.txt