16- Linux命令 find 命令

在linux中可以使用find命令在磁盤上查找文件,功能十分強大,下面總結一些常用的用法

find的基本模式是 find [path] [express]path可以省略,默認是當前目錄, express又區分為options(選項)+tests(條件)+actions(動作),express可以邏輯復合 express中,選項先不介紹了, test條件是的結果是真和假,可以省略的,若條件省略,則默認為true,ture則執行動作actions action動作也是可以省略的,默認的action是-print,即做輸出 由上二條可以看也,整個express省略的話,就是執行-print,打印出所有目錄項(包括目錄和文件)。

  1. 按文件名稱搜索
  • find命令正常正則表達式
    這個命令中path為當前目錄, -name ".log"為tests條件,沒有指定actions,所以當搜索到.log文件的時候執行默認的action -print
#不區分大小寫
find . -iname "abc"

find . -name "*.log"
  • 指定搜索層級
find . -maxdepth 2 -name "*.log"
  1. 按照文件權限搜索
    rwx表示 111 = 7
find . -perm 777
  1. 按照文件所有者查找
#查找當前目錄中所屬root用戶的文件
find . -user root 

find . -group zhouyang

#查找當前目錄中,所屬用戶不在/etc/passwd中的文件(也就是說,之前的用戶創建的文件,后來這個用戶被刪除了)
find . -nouser

find . -nogroup
  1. 跳過指定目錄
find . -path "./test" -prune -o -name "*.log" -print
with 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"
image.png
man find

這是因為當這個語句中只有-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
union
  • 使用查詢結果執行
    查詢大小為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的這一塊的命令還是有一些不太好用,不知道有沒有更簡單明白的
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容