find命令詳解

系統版本:

[root@node1 ~]# cat /etc/redhat-release 
CentOS Linux release 7.1.1503 (Core) 
[root@node1 ~]# uname -r
3.10.0-229.el7.x86_64

 

find

實時查找工具,通過遍歷指定起始路徑下文件系統層級結構完成文件查找。

 

工作特性

  • 查找速度略慢
  • 精確查找
  • 實時查找

 

用法

find [OPTIONS] [查找起始路徑] [查找條件] [處理動作]

  • 查找起始路徑: 指定具體搜索目標起始路徑,默認爲當前目錄
  • 查找條件: 指定的查找標準,可以根據文件名、大小、類型、從屬關係、權限等等標準進行,默認爲找出指定路徑下的所有文件
  • 處理動作: 對符合查找條件的文件做出的操作,例如刪除等操作,默認爲輸出至標準輸出

 

查找條件:文件名


選項:

  • -name "pattern": 查找文件名爲“pattern”的文件
  • -iname "pattern": 查找文件名爲“pattern”的文件,不區分大小寫

注:“pattern”支持glob風格的通配符,如:*,?,[],[^]

示例:

[root@node1 ~]# find /etc/ -iname "passwd"
#精確匹配查找文件名爲“passwd”的文件,但不區分大小寫
[root@node1 ~]# find /etc/ -iname "passwd*"
#查找以“passwd”開頭的文件,不區分大小寫

[root@node1 ~]# mkdir /etc/test
[root@node1 ~]# touch /etc/test/passwdx
[root@node1 ~]# find /etc -iname "passwd[[:alnum:]]"

 

查找條件:文件從屬關係


選項:

  • -user USERNAME: 查找屬主爲指定用戶的所有文件
  • -group GRPNAME: 查找屬組爲指定組的所有文件
  • -uid UID: 查找屬主爲指定的UID的所有文件
  • -gid GID: 查找屬組爲指定的GID的所有文件
  • -nouser: 查找沒有屬主的文件
  • -nogroup: 查找沒有屬組的文件

示例:

[root@node1 ~]# find /tmp/ -user moosefs
[root@node1 ~]# find /tmp/ -group moosefs
[root@node1 ~]# find /tmp/ -uid 3003
[root@node1 ~]# find /tmp/ -gid 3004

 

查找條件:文件類型


-type TYPE:

  • f: 普通文件
  • d: 目錄文件
  • l: 符號鏈接文件
  • b: 塊設備 文件
  • c: 字符設備文件
  • p: 管道文件
  • s: 套接字文件

示例:

[root@node1 ~]# find /dev -type b -ls
[root@node1 ~]# find /etc -type l -ls
#“-ls”表示“[處理動作]”

 

組合測試


  • 與: -a(默認組合邏輯)
  • 或: -o
  • 非: -not, !

示例:

[root@node1 ~]# find /tmp/ -nouser -type f -ls
or [root@node1 ~]# find /tmp/ -nouser -a -type f -ls
#必須符合兩個條件“-nouser”和“-type f”

[root@node1 ~]# find /tmp/ -not -type f -ls
or [root@node1 ~]# find /tmp/ ! -type f -ls

[root@node1 ~]# find /tmp/ -not -user root -a -not -iname "*fstab*" -ls
or [root@node1 ~]# find /tmp/ -not \( -user root -o -iname "*fstab*" \) -ls
#找出/tmp目錄下屬主爲非root,而且文件名不包含fstab字符串的文件
#第二種方式用括號括起來,原來的-a要改成-o,如果是-o,則要改成-a

 

查找條件:文件大小


-size [+|-]#UNIT
常用單位:K, M, G

  • #UNIT: (#-1, #],從所給值減1(不包含減了1的值)到所給值的區間
  • -#UNIT: [0,#-1],從0(包含0)到所給值減1的區間
  • +#UNIT: (#, ∞),從所給值(不包含該值)到無窮大

 

查找條件:時間戳


以“天”爲單位的選項:

  • -atime
  • -mtime
  • -ctime

以“分鐘”爲單位的選項:

  • -amin
  • -mmin
  • -cmin

選項後面跟值:
-atime [+|-]#
注:把#看成負數,因爲這裏的時間指過去時

  • -#: (#, 0],從所給值開始(不包含所給值),到0(包含0值)
  • #: [#, #-1),從所給值開始,到所給值減1(不包含減了1的值)
  • +#: (oo, #-1],從所給值減1開始,到無窮久遠

示例:

[root@node1 ~]# find /etc -atime +7 -ls
#查找7天之前訪問過的文件
[root@node1 ~]# find /etc -mtime -1 -ls
#查找1天之內修改過的文件

 

查找條件:權限


-perm [/|-]mode

  • mode: 精確權限匹配
  • /mode: 任何一類用戶(u,g,o)的權限中的任何一位(r,w,x)符合條件即滿足,9位權限之間存在“或”關係
  • -mode: 每一類用戶(u,g,o)的權限中的每一位(r,w,x)同時符合條件即滿足,9位權限之間存在“與”關係

示例:

[root@node1 ~]# cd /tmp/
[root@node1 tmp]# touch a b c d e f g
[root@node1 tmp]# chmod 640 a
[root@node1 tmp]# chmod 666 b
[root@node1 tmp]# chmod 440 c
[root@node1 tmp]# chmod 775 d
[root@node1 tmp]# chmod 777 e

[root@node1 tmp]# find ./ -perm 644 -ls
#精確匹配查找權限爲644的文件

[root@node1 tmp]# find ./ -perm /666 -ls
#至少有一類權限位有r或w(注意:這裏是“或”),即符合條件
[root@node1 tmp]# find ./ -perm /111 -ls
#至少有一類權限位有x,即符合條件
[root@node1 tmp]# find ./ -perm /002 -ls
#不看屬主和屬組權限,匹配其他用戶包含w權限的文件
#其他用戶具有w權限的文件危險性很高,一般不設定其他用戶具有w權限
[root@node1 tmp]# find ./ -perm -002 -ls
#這個結果和上面一條相同,因爲忽略屬主和屬組部分
[root@node1 tmp]# find ./ -perm /022 -ls
#只要屬組和其他用戶當中,有一類有w權限,即匹配
[root@node1 tmp]# find ./ -perm -022 -ls
#屬組和其他用戶必須同時擁有w權限的文件

[root@node1 tmp]# find ./ -perm /222 -ls
#至少有一類權限位有w,即符合條件
[root@node1 tmp]# find ./ -not -perm /222 -ls
#任何用戶都沒有w,即符合條件

[root@node1 tmp]# find ./ -perm -222 -ls
#匹配所有用戶都有w權限的文件
[root@node1 tmp]# find ./ -not -perm -222 -ls
#匹配至少有一類用戶沒有w權限的文件

#至少有一類用戶有權限的反義:任何用戶都沒有權限
#所有用戶都有權限的反義:至少有一類用戶沒有權限

 

處理動作


  • -print: 輸出至標準輸出(默認動作)
  • -ls: 類似於對查找到的文件執行“ls -l”命令,輸出文件的詳細信息
  • -delete: 刪除查找到的文件
  • -fls /PATH/TO/SOMEFILE: 把查找到的所有文件的長格式信息保存至指定文件中
  • -ok COMMAND {} \;: 對查找到的每個文件執行由COMMAND表示的命令,每次操作都由用戶進行確認
  • -exec COMMAND {} \;: 對查找到的每個文件執行由COMMAND表示的命令

示例:

[root@node1 tmp]# useradd centos
[root@node1 tmp]# chown centos:centos c e
[root@node1 tmp]# userdel -r centos
[root@node1 tmp]# find ./ -nouser -a -nogroup
#查找沒有屬主也沒有屬組的文件
[root@node1 tmp]# find ./ -nouser -a -nogroup -ok chown root:root {} \;
#將沒有屬主也沒有屬組的文件,屬主和屬組都改爲root

[root@node1 tmp]# find ./ -perm /002 -exec mv {} {}.danger \;
#將其他用戶具有w權限的文件改名加上danger標記

 

xargs


在使用 find命令的-exec選項處理匹配到的文件時, find命令將所有匹配到的文件一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘之後,就會出現溢出錯誤。錯誤信息通常是“參數列太長”或“參數列溢出”。這就是xargs命令的用處所在,特別是與find命令一起使用。

xargs從find命令接收並傳遞參數,配合管道符|來使用,把find命令的stdout作爲自己的stdin,再轉換成command line形式的參數傳給其它命令。

語法:

find [options] | xargs [options] [TargetCommand [options]]

選項:

  • -l1: 一次傳遞一行給後面的命令(默認爲一行)
  • -t: 處理之前打印出命令
  • -i: 用{}替代stdin獲取的數據
  • -I []: 用[]或其它符號替代從stdin獲取的數據(-l後面必須跟替代符號)
  • -p: 提示是否執行後面的命令,y執行,n不執行

示例:

[root@node1 ~]# find . -type f -name "*.log" -print0 | xargs -0 rm -f
#將當前目錄下以“.log”結尾的普通文件刪除
#xargs解決/bin/rm Argument list too long的問題

[root@node1 ~]# find . -perm -7 -print | xargs chmod o-w
#在當前目錄下查找其他用戶具有rwx權限的文件,並收回相應的w權限

[root@node1 ~]# find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f
#將當前目錄下在24小時之前(包含24小時)訪問過的普通文件刪除

[root@node1 ~]# find . -name "*.log" | xargs -p -i mv {} test4
or [root@node1 ~]# find . -name "*.log" | xargs -p -I [] mv [] test4
#將當前目錄下以“.log”結尾的文件移動到“test4”目錄

 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章