1. 程式人生 > 其它 >Find命令-Linux系統搜尋利器

Find命令-Linux系統搜尋利器

1.Motivation


搜尋查詢是管理檔案系統常用的操作,雖然動作邏輯本質上是匹配,很簡單,但搜尋也有很多種花樣,可以用來加速搜尋,快速提取想要的內容

  • 最簡單的搜尋:你想遞迴遍歷從當前目錄下所有子目錄以及子目錄下的檔案,得以瞭解這個目錄組織結構
  • 基於檔名的搜尋:你想遞迴搜尋從當前目錄下所有擁有特定檔名或者字尾的檔案
  • 基於檔案路徑的搜尋:你想遞迴搜尋從當前目錄下所有擁有特定路徑名的路徑
  • 檔名反向排除的搜尋:你不知道目標檔案可能是什麼但可以確定目標檔案絕不是什麼,需要將不可能的檔案排除在外
  • 目錄範圍模糊的搜尋:當你可以確定目標檔案在當前目錄下的多少級範圍內且目錄層次較深時,超過一定級數範圍的目錄就可以不必搜尋
  • 基於檔案型別的搜尋:你也許只是想要搜尋目錄,或者連結,或者字元裝置等等,其他檔案型別就可以不必搜尋
  • 基於檔案時間的搜尋:你可能剛剛改動了許多檔案但不記得名字,那麼在過去的一個時間範圍上對檔案的三個時間進行搜尋:訪問時間,修改時間,變化時間
  • 基於檔案大小的搜尋:如果一個目錄的體積很大,你想要知道在這個目錄中哪些檔案是大檔案
  • 基於檔案許可權的搜尋:對可讀、可寫、可執行以及使用者訪問差異來搜尋檔案
  • 搜尋並對結果執行一系列命令:繁瑣任務自動化

2.Explanation & Example


  • 最簡單的搜尋:
find .  #從當前目錄開始遞迴遍歷所有子目錄以及下面的檔案,打印出來
  • 基於檔名的搜尋:
find . -name "hello.txt"   #從當前目錄開始遞歸向下搜尋名為hello.txt的檔案
find . -name "*.txt"       #從當前目錄開始遞歸向下搜尋字尾名為txt的檔案
find . -iname "hello*"     #從當前目錄開始遞歸向下搜尋名為hello和HELLO的檔案
find . ( -name "*.txt" -o -name "*.pdf" )   #從當前目錄開始向下遞迴搜尋字尾名為txt或者pdf的檔案
  • 基於檔案路徑的搜尋:
find . -path "*/test/*"    #從當前目錄開始向下遞迴搜尋包含test路徑名的路徑
  • 檔名反向排除的搜尋:
find . ! -name "*.txt"     #從當前目錄開始向下遞迴搜尋非txt檔案
  • 目錄範圍模糊的搜尋:
find . -maxdepth 3 -name "*.txt"    #從當前目錄開始向下遞迴搜尋最大3層目錄範圍內包含的txt檔案
find . -mindepth 2 -name "hello*"   #從當前目錄的下一級目錄開始向下遞迴搜尋名字包含hello的檔案
find . ( -name ".git" -prune ) -o ( -type f )   #從當前目錄開始向下遞迴搜尋除了.git目錄的其他所有目錄以及包含的檔案
  • 基於檔案型別的搜尋:
find . -type d  #從當前目錄開始向下遞迴搜尋目錄檔案
find . -type f  #從當前目錄開始向下遞迴搜尋普通檔案
find . -type l  #從當前目錄開始向下遞迴搜尋連結檔案
find . -type s  #從當前目錄開始向下遞迴搜尋套接字檔案
find . -type b  #從當前目錄開始向下遞迴搜尋塊裝置
find . -type c  #從當前目錄開始向下遞迴搜尋字元裝置
find . -type p  #從當前目錄開始向下遞迴搜尋FIFO檔案
  • 基於檔案時間的搜尋:
find . -atime -7 #搜尋7天以內訪問過的檔案
find . -atime 7  #搜尋正好7天前訪問過的檔案
find . -atime +7 #搜尋7天以前訪問過的檔案
find . -ctime 7  #搜尋正好7天前改變的檔案
find . -mtime 7  #搜尋正好7天前修改的檔案
find . -amin 7   #搜尋正好7分鐘前訪問過的檔案
find . -newer file.txt  #搜尋比file的修改時間更新的檔案
  • 基於檔案大小的搜尋:
find . -size +2k   #搜尋等於2k的檔案
find . -size -2k   #搜尋小於2k的檔案
find . -size 2k    #搜尋等於2k的檔案
檔案大小的單位是b(512B),c(B),w(2B),k(1024B),M(1024k),G(1024M)
  • 基於檔案許可權的搜尋:
find . -perm 644
find . -user neo
  • 搜尋並對結果執行相關命令:
find . -name "*.txt" -delete     #從當前目錄開始向下遞迴搜尋txt檔案並刪除
find . -name "*.c" -exec cat {} ; > all_c_files  #從當前目錄開始向下遞迴搜尋c檔案並將所有的內容匯聚到all_c_files
find . -mtime +10 -name "*.txt" -exec cp {} OLD ; #從當前目錄開始向下遞迴搜尋10天以前修改過的txt檔案並將他們複製到OLD資料夾中
find . -type f -name "*.txt" -exec ./command.sh {} ;  #從當前目錄開始向下遞迴搜尋txt檔案並交給command.sh作為引數執行

3.Notice


以上多個引數在命令後面的位置是有區別的,它們的位置決定了搜尋的邏輯,也影響搜尋的效率,比如限定搜尋目錄範圍應該優先於限定搜尋檔案的名字

實際使用還需要從搜尋邏輯來考慮多個影響因素,進而加快搜索速度,提高搜尋效率