find命令的功能很強大,查找文件的選項很多,所以這是一個很實用並且很常用的linux命令。但是他有個缺點就是搜索的時候比較慢的。而與之相對的有一個locate命令。
find的命令格式
find pathname -option [-print ] [ -exec -ok command] {} \;
2. 命令參數:
pathname : find命令所查找的目錄路徑。相對路徑和絕對路徑都可以的。
-print: find命令將匹配的文件輸出到標准輸出(默認就是將找到的文件輸出到標准輸出)
-exec command {} \ : find命令對匹配的文件執行該參數所給出的command命令,注意"{}"與 "\"之間的空格。
-exec ok {} \: 與exec命令參數差不多,只不過多了一個檢查,在執行每一個命令之前要求用戶來確認是否執行。
3. 命令的選項:
常用:
-name filename : 查找名為filename的文件(常用的選項)
文件屬性:
-perm xxxx : 按照xxxx代表的執行權限來查找
-user username :按照文件屬主來進行查找
-group groupname: 按照文件屬組進行查找
-nouser 查找無有效屬主的文件,即屬主在/etc/passwd中不存在的
-nogroup 查找無有效屬組的文件,即屬主在/etc/groups中不存在的
文件時間屬性:
-mtime -n +n 按照文件更改時間進行查找 , -n指n天以內 +n指n天以前
-atime -n +n 按照文件訪問時間來查找
-ctime -n +n 按照文件創建時間來查找
-newer file1 ! file2 查找更改時間比file1新但是比file2舊的文件
文件類型屬性:
-type 查找某一個類型的文件
b - 塊設備目錄
d - 目錄
c - 字符設備文件
p - 管道文件
l - 符號鏈接文件
f - 普通文件
其他類型
-size n [c] : 查找文件長度為n塊的文件 ,帶 c 的時候表示文件長度以字節計算。
-depth: 查找文件的時候首先查找當前目錄下,然後再查找其子目錄。
-fstype: 查找位於某一類型的文件系統中的文件,這些文件系統類型通常可以在配置文件/etc/fstab中找到,該配置文件中包含了本文件系統的信息。
-mount : 在查找文件時不跨越文件系統mount點。(這句話不是太理解哈,等下實例中看下。)
-follow : 如果find命令遇到符號鏈接文件,就跟蹤至鏈接所指向的文件。
-cpio: 對匹配的文件使用cpio命令,將這些文件備份到磁盤設備中。
-prune : 忽略某個目錄
另外,下面三個的區別:
-amin n 查找系統中最後N分鐘訪問的文件
-atime n 查找系統中最後n*24小時訪問的文件
-cmin n 查找系統中最後N分鐘被改變文件狀態的文件
-ctime n 查找系統中最後n*24小時被改變文件狀態的文件
-mmin n 查找系統中最後N分鐘被改變文件數據的文件
-mtime n 查找系統中最後n*24小時被改變文件數據的文件
4. 使用實例
(1)-name選項
比較常用的選項,並且可以使用匹配符或者正則表達式來匹配文件(匹配符與正則的區別需要注意下)。如果是具體的文件名可以引號引起來也可以不用引號,但是文件名匹配模式是一定要用引號引起來的。
在根目錄“/”下查找文件名為 "test.txt"的文件
# find / -name "test.txt" -print
#匹配符與正則表達式的應用:
查找目錄下所有的 “*.log”
# find . -name "*.log" -print
查找目錄下以大寫字母開頭的文件
# find / -name "[A-Z]*" -print
查找一個以小寫字母開頭,數字結尾的文件
# find / -name "[a-z]*[0-9]" -print
(2)文件屬性選項
-perm xxx
查找文件權限為755的文件,可以和-name混合使用
# find / -perm 755 -print
查找一個文件屬主是root,屬組也是root的文件(這種單獨使用是沒什麼意義的,這都是一些限制條件混合使用)
# find / -user root -group root -print
當然還有查找屬主和屬組都已經被刪除的文件
# find . -nouser -nogroup -print
(3)文件時間屬性
# 查找最後48小時內訪問過的文件
$ find / -atime -2
# 查找最後24小時內修改過的文件
$ find / -mtime -1
(4)忽略某個目錄
使用選項 -prune 支出忽略的目錄。使用-prune選項的時候注意不要和-depth一起用,-prune會被忽略。
# 忽略test目錄下的hello目錄
$ find test -path "test/hello" -prune -o -print
說明下:find [-path] [expression]
在路徑列表後面是表達式
find test -path "test/hello" -prune -o -print
-a 和 -o 是shell中的短路求值,與 && 和 || 結果類似。
-path "test/hello" 為真,則求值-prune ,則與邏輯為真,後面的-print不需要執行,否則求值 -print(利用-o的短路特性)
可以理解為如下所示的shell流程:
if -path "test/hello" then
-prune
else
-print
忽略多個目錄的操作:
find test \( -path test/test4 -o -path test/test3 \) -prune -o -print
增加一個轉義 "\"
查找某一確定文件,-name等選項加在-o 之後
命令:
find test \(-path test/test4 -o -path test/test3 \) -prune -o -name "*.log" -print
(5)組合使用:操作之後加入命令 find pathname -option [-print ] [ -exec -ok command] {} \;
#查看當前目錄下的所有普通文件並通過ls -l來顯示詳細信息
$ find . -type f -exec ls -l {} \;
#還可以再加一些條件,組合使用
$ find logs -type f -mtime +5 -exec -ok rm -rf {} \
#刪除五日以前有更改的文件 這個命令在運維的時候很有用,刪除一些日志文件的時候。
*有一個很好的應用場景是:find查找文件,然後grep看文件裡面是否有我們需要的字段
#在/tmp中尋找*.h,並在這些文件中查找"TEST"字段
$ find /tmp -name *.h | xargs -n50 grep TEST
$ find /tmp -name "*.h" -exec grep "TEST" {} \; -print
#將查找到的文件復制到指定地方
$ find /tmp -name test -exec cp '{}' /test ';'
特殊文件可以使用cpio的
$ find dir -name filename -print | cpio -pdv newdir (暫時還不之後cpio的用法,先記錄下來)
#可以使用管道來處理find查找出來的 文件列表
$ find ./ -name "*.php" | ls -l -full-time 2>/dev/null | grep "2016-07-03 22:39"
查找2016-07-03 22:39更改過的文件
-----
參考鏈接:
每天一個linux命令find
linux find用法實例