首頁 > 軟體

Linux中find命令細節詳解

2020-06-16 16:51:11

find命令特點:檔案查詢,實時查詢,速度略慢,精確匹配

使用格式:# find [options] [查詢路徑] [查詢條件] [處理動作]

查詢路徑:預設為當前目錄

查詢條件:預設為查詢指定路徑下的所有檔案

處理動作:預設為顯示

  • 查詢/tmp目錄下檔名passwd的檔案:# find /tmp -name "passwd"
  • 查詢/tmp目錄下檔名passwd開頭的檔案,passwd不區分大小寫# find /tmp -iname "passwd*"
  • 查詢/tmp目錄下屬主keyso的檔案:# find /tmp -user keyso
  • 查詢/tmp目錄下屬組keyso的檔案:# find /tmp -group keyso
  • 查詢/tmp目錄下UID502的檔案:# find /tmp -uid 502
  • 查詢/tmp目錄下GID502的檔案:# find /tmp -gid 502

一個普通使用者例如keyso建立了/tmp/keyso.txt,該檔案屬主和屬組都是keyso,但當keyso使用者被刪除之後,/tmp/keyso.txt檔案的屬主和屬組會發生變化,此種情況無法再根據屬主為keyso這個被刪除使用者查詢到/tmp/keyso.txt檔案

  • 查詢/tmp目錄下沒有屬主的檔案:# find /tmp -nouser
  • 查詢/tmp目錄下沒有屬組的檔案:# find /tmp -nogroup
  • 查詢/tmp目錄下的目錄:# find /tmp -type d

-type檔案型別包括:f(普通檔案)、d(目錄)、b(塊裝置)、c(字元裝置)、l(符號連結檔案)、p(命名管道)和s(通訊端)等

  • 查詢/tmp目錄下大於100M的檔案:# find /tmp -size +100M

-size:根據檔案大小查詢,-size [+ | -]#[k | M | G]+(大於),-(小於),沒有+-,就是精確匹配

#實際的取值範圍:(#-1<x<=#

  • 查詢/tmp目錄下一天之內被存取過的檔案:# find /tmp -atime -1

格式:-[a | m | c][time | min] [+ | -]#

根據time時間戳查詢(以天為單位):

-atime:存取時間,就是一個檔案最後一次被存取的時間

-mtime:修改時間,就是檔案的內容最後被修改的時間

-ctime:改變時間,就是檔案或者目錄的屬性(屬主、屬組、許可權等等)被改變的時間

根據min時間戳查詢(以分鐘為單位):

-amin:意義同-atime

-mmin:意義同-mtime

-cmin:意義同-ctime

+#:表示(#+1)天之外被存取過

-#:表示#天之內被存取過

#:表示在#<=x<#+1)天的時間段內被存取過

  • 查詢/tmp目錄下許可權為644的檔案:# find /tmp -perm 644

根據許可權查詢,格式:-perm [+ | -]MODE

+MODE:任何一類使用者的任何一位許可權匹配,常用於查詢某類使用者的某特定許可權是否存在

-MODE:每類使用者的指定要檢查的許可權位都要匹配

MODE:精確匹配所給的許可權

範例:        //6=4+2=r+w

  • 查詢/tmp目錄下許可權為666的檔案(精確匹配):# find /tmp -perm 666
  • 查詢/tmp目錄下其他使用者有讀寫許可權的檔案:# find /tmp -perm -006
  • 查詢/tmp目錄下其他使用者有讀或者寫許可權的檔案:# find /tmp -perm +006
  • 查詢/tmp目錄下至少有一類使用者有寫許可權的檔案:# find /tmp -perm +222
  • 查詢/tmp目錄下所有使用者都有寫許可權的檔案:# find /tmp -perm -222
  • 查詢/tmp目錄下所有使用者都沒有寫許可權的檔案:# find /tmp -not -perm +222

       //“所有使用者都沒有”和“只要有一類使用者有”意思相反

       //只確定不能有寫許可權,並不能確定有沒有讀和執行許可權

  • 查詢/tmp目錄下至少有一類使用者沒有寫許可權的檔案:# find /tmp -not -perm -222

       //“至少有一類使用者沒有”和“所有使用者都有”意思相反

  • 查詢/tmp目錄下屬組或者其他使用者有讀寫許可權的檔案:# find /tmp -perm -060 -o -perm -006
  • 查詢/tmp目錄下屬組和其他使用者都有讀寫許可權的檔案:# find /tmp -perm -066
  • 查詢/tmp目錄下屬組有讀或者寫許可權,或者其他使用者有讀或者寫許可權的檔案(41):

# find /tmp -perm +066

  • 查詢/tmp目錄下的普通檔案,並刪除:# find /tmp -type f -exec rm -rf {} ;
  • 查詢/tmp目錄下大於10M的檔案,並以長格式顯示檔案資訊:# find /tmp -size +10M -ls
  • 查詢/tmp目錄下以.doc結尾的檔案,並重新命名為.docx# find /tmp -iname "*.doc" -exec mv {} {}x ;

處理動作:

-ls:以長格式顯示檔案資訊

-exec COMMAND {} ; -->  對查詢到的檔案執行指定的命令,{}為預留位置,指代find查詢到的檔案

-ok COMMAND {} ; -->  -exec COMMAND {} ;類似,互動式的-exec

|xargs COMMAND:對查詢到的檔案執行指定的命令,功能與-exec COMMAND {} ;類似

備註:-execxargs的區別

-execfind將查詢到的所有檔案一次性全部傳遞給-exec所指定的命令,容易出現溢位錯誤。-exec為處理每一個匹配到的檔案而發起一個相應的進程,會導致進程過多,系統效能下降

xargs:對find傳遞給xargs所指定的命令的檔案,每次只獲取一部分而不是全部,不會出現溢位錯誤。另外xargs只會發起一個進程,不會導致系統效能下降

  • 查詢/tmp目錄下沒有屬主或屬組,且最近1個月內曾被存取過的檔案:

# find /tmp ( -nouser -o -nogroup ) -a -atime -30            //括號內側的兩端都需要加空格

組合條件:

-a:與,同時滿足,如果組合條件中只有-a,可以省略  -->  # find /tmp -user Hadoop [-a] -name "*.txt"

-o:或,只需滿足其一即可,優先順序比-a低,如果需要先執行-o條件,需要加()()需要跳脫

-not | !:非,取反

A且非B  <==>  非(AB      -not A -a -not B  <==> -not ( A -o B )

A或非B  <==>  非(AB      -not A -o -not B  <==> -not ( A -a B )

本文永久更新連結地址https://www.linuxidc.com/Linux/2018-05/152609.htm


IT145.com E-mail:sddin#qq.com