在linux中可以使用find命令在磁盤上查找文件,功能十分強大,下面總結一些常用的用法
find的基本模式是 find [path] [express]path可以省略,默認是當前目錄, express又區分為options(選項)+tests(條件)+actions(動作),express可以邏輯復合 express中,選項先不介紹了, test條件是的結果是真和假,可以省略的,若條件省略,則默認為true,ture則執行動作actions action動作也是可以省略的,默認的action是-print,即做輸出 由上二條可以看也,整個express省略的話,就是執行-print,打印出所有目錄項(包括目錄和文件)。
- 按文件名稱搜索
- find命令正常正則表達式
這個命令中path為當前目錄, -name ".log"為tests條件,沒有指定actions,所以當搜索到.log文件的時候執行默認的action -print
#不區分大小寫
find . -iname "abc"
find . -name "*.log"
- 指定搜索層級
find . -maxdepth 2 -name "*.log"
- 按照文件權限搜索
rwx表示 111 = 7
find . -perm 777
- 按照文件所有者查找
#查找當前目錄中所屬root用戶的文件
find . -user root
find . -group zhouyang
#查找當前目錄中,所屬用戶不在/etc/passwd中的文件(也就是說,之前的用戶創建的文件,后來這個用戶被刪除了)
find . -nouser
find . -nogroup
- 跳過指定目錄
find . -path "./test" -prune -o -name "*.log" -print
這個命令被-o(或)分為了兩部分,因為-o(或)的特性,當前一個語句為true的時候,后面的語句不管是true還是false,結果都是true,所以當前一個為true的時候,后面的語句不會被執行。
第一部分-path "./test" -prune,這個部分-path "./test"為條件 -prune為動作
第二部分 -name "*.log" 為條件, -print為動作
當掃描到test文件的時候,第一個條件滿足,執行-prune動作(跳過這個文件下的子目錄),此時并不會會執行第二條語句,
當掃描到session.log abc.log等文件的時候,第一個語句條件沒有滿足,繼續執行第二個語句,當滿足第二個語句之后執行-print動作。
因為-print是默認的動作,所以就想是不是去掉也可以呢,當去掉之后,發現輸出和原來不同了,多了一個./test的輸出,這個為啥呢?
find . -path "./test" -prune -o -name "*.log"
這是因為當這個語句中只有-prune,沒有其他動作的時候,會為滿足條件的語句自動執行-print動作。
所以就也會把./test打印出來了。
- 按照文件修改時間查找
#比test創建時間晚的文件
find . -newer test
#查找在3天之內修改的文件
find . -mtime -3
#查找在5天之前修改的文件
find . -mtime +5
- 根據文件類型查找文件
f 表示文件 d 表示文件夾 等等
find . -type f
- 根據文件大小查找文件
注意默認的單位是塊(512字節) 也可以使用字節 Nc
- 表示大于
- 表示小于
#查找文件大于 100字節的
find . -size +100c
#查找文件大于10塊的
find . -size +10
- 多條件組合使用
查找文件小于100字節,創建時間小于3天,所屬root用戶,名字帶有log的文件
find . -size -100c -name "*.log" -user root -mtime -3 -type f
- 使用查詢結果執行
查詢大小為0的文件然后刪除
find . -size 0 -ok rm {} \;
find . -size 0 -exec rm {} \;
find . -name "*.bak" |xargs -i cp {} home
可以使用-ok 和 -exec來完成這樣的操作,區別是-ok會再次詢問一次,-exec會直接執行。
這里需要注意寫法
-exec command {} ;
{}表示find查詢出來的結果,;表示命令結束的標志
- 總結
看到跳過文件那一塊的時候,確實給嚇到了,怎么突然這么復雜,感覺完全懵逼了。已經想要放棄了,后來還是慢慢的理解吧,也理解個7788。之前一直沒有弄明白find的語法結構。現在知道了find的語法里分 條件和動作,只有當條件為true的時候緊跟的動作才會執行。上面的跳過文件那一直以為跳過文件也是一個判斷條件,一直想著是一個文件既滿足不是test下的,又滿足-name的條件,對于命令里面的-o一直不明白。后來才發現-prune是一個動作,這才慢的搞明白了。感覺find的這一塊的命令還是有一些不太好用,不知道有沒有更簡單明白的