find命令詳解


學會使用find之前,先補充下通配符小知識,對於使用find命令會有很多幫助

*  任意多個任意字符

?  單個字符

[a-z]  多個字符或連續范圍中的一個,若無則忽略

{a,min,xyz}  多組不同的字符串,全匹配 

 

find

find命令是用於實現精確查找,實時查找指定目錄下面的文件。在工作中常用。優點是:實時,精確。缺點是:比較占用系統資源,比較慢一點。
在總結find之前,先簡單總結一下which,whereis,locate簡單用法。他們都是用於查找和定位文件的命令。

1.which命令 查找命令的二進制文件位置

例如:
]# which id
/usr/bin/id
]# which cd
/usr/bin/cd

2.whereis 文件名字的查找

選項 -b,只查找二進制文件
-m 只查找使用手冊路徑下的文件

例如:
]# whereis ifconfig
ifconfig: /usr/sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz
查找文件名為passwd 的文件 默認情況下使用手冊所在的章節都會查找出來。

3.locate 快速定位給定的文件名,也可以給定文件的部分名字。

常用選項:
-i   忽略大小寫
-l   輸出前幾行,例如 -l 5 輸出找到的結果前5行
-S 輸出locate使用的數據庫信息
-b  只匹配路徑中基名
-c  只統計查到的符合條件文件數量
-r  使用正則表達式
locate的優點是速度非常快,但是不能實現精確查找,同時依賴於已建立的數據庫/var/lib/mlocatel里面的數據進行查找,不用搜索硬盤,所有很快。但是當你新建文件時,數據庫還沒有更新,默認是每天自動執行執行一次更新,這時候locat是無法查到的,這時候需要手動執行updatedb更新即可。

例如:
]# locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/home/dxl/passwd
]# locate -S
數據庫 /var/lib/mlocate/mlocate.db:
14,196 文件夾
82,472 文件
4,403,787 文件名中的字節數
2,007,138 字節用於存儲數據庫


 

find命令詳解

功能:對文進行實時,精確查找。
用法:find [OPTIONS] [查找起始路徑] [查找條件] [處理動作]
查找起始路徑:指定查找范圍,默認是當前工作目錄下進行查找
查找條件:指定查找目標的查找標准,可以根據文件名、大小、類型、從屬關系、權限等標准進行;默認為找出指定路徑下的所有文件。
處理動作:對查找出來的文件進行刪除,移動等操作,默認為輸出到屏幕上。

find命令的參數

pathname: find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄。
-print: find命令將匹配的文件輸出到標准輸出。
-exec: find命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式為'command' { } \;,注意{ }和\;之間的空格。
-ok: 和-exec的作用相同,只不過以一種更為安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。

#-print 將查找到的文件輸出到標准輸出
#-exec   command   {} \;      —–將查到的文件執行command操作,{} 和 \;之間有空格
#-ok 和-exec相同,只不過在操作前要詢用戶

-name   filename              #查找名為filename的文件
-perm                               #按執行權限來查找
-user    username            #按文件屬主來查找
-group groupname          #按組來查找
-mtime   -n +n                 #按文件更改時間來查找文件,-n指n天以內,+n指n天以前
-atime    -n +n                 #按文件訪問時間來查GIN: 0px">

-ctime    -n +n                 #按文件創建時間來查找文件,-n指n天以內,+n指n天以前

-nogroup                        #查無有效屬組的文件,即文件的屬組在/etc/groups中不存在

-nouser                          #查無有效屬主的文件,即文件的屬主在/etc/passwd中不存
-newer   f1 !f2                #找文件,-n指n天以內,+n指n天以前 
-ctime    -n +n                #按文件創建時間來查找文件,-n指n天以內,+n指n天以前 
-nogroup                       #查無有效屬組的文件,即文件的屬組在/etc/groups中不存在
-nouser                         #查無有效屬主的文件,即文件的屬主在/etc/passwd中不存
-newer   f1 !f2               #查更改時間比f1新但比f2舊的文件
-type    b/d/c/p/l/f          #查是塊設備、目錄、字符設備、管道、符號鏈接、普通文件
-size      n[c]                 #查長度為n塊[或n字節]的文件
-depth                          #使查找在進入子目錄前先行查找完本目錄
-fstype                         #查更改時間比f1新但比f2舊的文件
-type    b/d/c/p/l/f         #查是塊設備、目錄、字符設備、管道、符號鏈接、普通文件
-size      n[c]                #查長度為n塊[或n字節]的文件
-depth                         #使查找在進入子目錄前先行查找完本目錄
-fstype                        #查位於某一類型文件系統中的文件,這些文件系統類型通常可 在/etc/fstab中找到
-mount                        #查文件時不跨越文件系統mount點
-follow                        #如果遇到符號鏈接文件,就跟蹤鏈接所指的文件
-cpio                %;      #查位於某一類型文件系統中的文件,這些文件系統類型通常可 在/etc/fstab中找到
-mount                        #查文件時不跨越文件系統mount點
-follow                        #如果遇到符號鏈接文件,就跟蹤鏈接所指的文件
-cpio                          #對匹配的文件使用cpio命令,將他們備份到磁帶設備中
-prune                       #忽略某個目錄
-amin         # 查找在系統中最后N分鍾訪問的文件
-mmin             # 查找在系統中最后N分鍾里修改過的文件
 

1.根據文件名查找:-name 可以支持glob風格文件名通配

用法:find 查找路徑 -name 文件名

]# find . -name “*.txt”   查找/tmp目錄下所有的txt文件
./maxusers.txt
./we/dd1.txt
./we/dd2.txt
./we/dd3.txt

]# find . -name “[A-Z]*” -print    查找當前目錄及子目錄中查找文件名以一個大寫字母開頭的文件
./man/man3/Git.3pm.gz
./man/man3/Git::I18N.3pm.gz

]# find . -name “f*”     查找/tmp目錄下以f開頭的文件
./functions
./fenzu
./fenz

]# find /usr -name “[a-z][0-9]” 查找/usr目錄下以小寫字母開頭,后面跟數字0-9開頭的文件
/usr/bin/m4
/usr/share/gcc-4.8.2/python/libstdcxx/v6

 

2.根據文件從屬關系查找:

  • -user USERNAME:查找屬主為指定用戶的所有文件。

查找/var目錄下文件屬主為centos用戶的所有文件
]# find /var -user centos
/var/spool/mail/centos

  • -group GRPNAME:查找屬組為指定組的所有文件.

查找 /home目錄里面屬組為nologin的文件
]# find /home -group nologin -ls
6292165 0 drwx—— 2 nologin nologin 76 10月 20 20:55 /home/nologin
6292166 4 -rw-r–r– 1 nologin nologin 18 9月 7 00:25 /home

  • -uid UID:查找屬主指定的UID的所有文件。

查找/var目錄下uid為48的文件
]# find /var -uid 48 -ls
771874 0 drwx—— 2 apache apache 6 10月 12 01:17 /var/lib/dav
17148123 0 drwx—— 3 apache apache 19 10月 12 01:17 /var/cache/httpd

  • -gid GID:查找屬組指定的GID的所有文件。

查找/var目錄下gid為91的文件
]# find /var -gid 91 -ls
17133941 0 drwxr-xr-x 3 root tomcat 21 10月 13 10:30 /var/lib/tomcat
25354344 0 drwxrwxr-x 2 root tomcat 6 8月 7 12:32 /var/lib/tomcat/webapps

  • -nouser:查找沒有屬主的文件。

查找/home目錄里面沒有屬主的文件
]# find /home -nouser
/home/mandriva
/home/mandriva/.bash_logout
/home/mandriva/.bash_profile
/home/mandriva/.bashrc

  • -nogroup:查找沒有屬組的文件。

例如:查找/tmp目錄里面沒有屬組的文件
[root@centOS tmp]# find /tmp -nogroup -ls
16798173 0 -rw-r–r– 1 root 2050 0 10月 18 17:37 /tmp/fenz

 

3.根據文件的類型查找,常見的文件類型有如下

用法:find 查找路徑 -type 文件類型
f: 普通文件
d: 目錄文件
l:符號鏈接文件
b:塊設備 文件
c:字符設備文件
p:管道文件
s:套接字文件

查找/dev目錄下的所有塊設備
[root@centOS tmp]# find /dev -type b
/dev/sda6
/dev/sda5
/dev/sda4

1、找出/tmp目錄下屬主為非root的所有文件;
]# find  .  !  -user  root  -ls   方法1:用!號表示非
16819217 20 -rw-r–r– 1 dxl distro 17480 10月 21 17:57 ./functions
17126623 0 drwxr-xr-x 3 dxl root 61 10月 22 18:10 ./we

]# find .  -not  -user  oot  -ls   方法2:加-not,表示非
16819217 20 -rw-r–r– 1 dxl distro 17480 10月 21 17:57 ./functions
17126623 0 drwxr-xr-x 3 dxl root 61 10月 22 18:10 ./we

2、找出/tmp目錄下文件名中不包含fstab字符串的文件;

]# find  .  -name  “fstab”   先找出帶fstab字符的文件
./fstab
./fstab222
]# find  .  !  -name  “fstab

3、找出/tmp目錄下屬主為非root,而且文件名不包含fstab字符串的文件;
]# find  .  !  -name  “fstab”  !  -user  root  -ls
16819217 20 -rw-r–r– 1 dxl distro 17480 10月 21 17:57 ./functions
17126623 0 drwxr-xr-x 3 dxl root 61 10月 22 18:10 ./we

組合條件:邏輯表達式
-a 與:前后條件要通時滿足,find默認為這個選項
-o: 或者
!,-not:非

 

4.根據指定的文件的大小查找

-size  [+|-]指定文件的大小

常用單位有:k(千字節), M(兆字節), G(1024M字節)
1G=1024M=1024K
例如:我要在某目錄查找並指定為10k的文件,有三種輸入方式表示三種不同的查找結果
10k:查找到的結果為大於9k,小於或等10k的文件
-10k:查找大於0小於10k的文件
+10k:查找大於大於10k的文件

查找/var目錄下,查找深度到 2級子目錄,大於11k的文件 ]# find /var -maxdepth 2 -size +11k -type f -exec ls -lh {} \; -rw-r--r--. 1 root root 585K 10月 28 10:32 /var/log/lastlog -rw-rw-r--. 1 root utmp 131K 10月 28 10:32 /var/log/wtmp ......... 

5.根據時間戳查找:就是根據文件的修改時間,訪問時間,文件屬性改變時間來查找文件

1.以“天”為單位:
find  查找目標   -atime  [+|-]n   

“4” :4天前的那一天,表示查找第5天00:00到23.59分59秒創建的文檔
“-4” :表示查找小於等於過去4天內的文檔
“+4” :查找大於等於過去5天的文件

查找/var目錄內過去4天內的修改過的文件
]# find  /var   -mtime  -4 -exec ls   -rlt {} \;           

以“分鍾”為單位:
-amin
-mmin
-cmin

 

6.根據權限查找:

-perm  [/|-]mode
  • mode:精確權限匹配,按給出的權限進行精確查找

]# find . -perm 646 -exec ls -l {} \;    
-rw-r--rw-. 1 root root 0 10月 28 12:58 ./ddd.txt
  • /mode:權限前加斜線,任何一類用戶(u,g,o)的權限中的任何一位(r,w,x)符合條件即滿足,權限之間存在“或”關系。
要查找權限位的其他人有寫權限的文件,
]# find  . -perm  /002  -exec  ls  -l  {}  \;   
-rw-r--rw-. 1 root root 0 10月 28 12:58 ./ddd.txt
-rw-r--rw-. 1 root root 0 10月 28 12:58 ./ddd.txt
]# find  . -perm  /222  -exec  ls  -l  {}  \;    查找任何有寫入權限的文件
總用量 0
-rw-r--rw-. 1 root root  0 10月 28 12:58 ddd.txt
drwxr-xr-x. 2 root root 38 10月 28 13:00 dir1
..........
說明:第一個實例/002,表示只對其他用戶的權限位的寫權限進行查找。
002就是不進行屬主和屬組的權限位進行查找的意思。
但是在centos6上面有區別,centos6上/002也可以用+002表示,centos7上面find不再使用+號。
centos6上/002表示任意權限位存在寫入的都會找到
  • -mode:每一類用戶(u,g,o)的權限中的每一位(r,w,x)同時符合條件即滿足,權限之間存在“與”關系。

]# find . -perm -664 -exec ls -l {} \;
-rw-rw-rw-. 1 root root 0 10月 28 12:58 ./ddd.txt

處理動作:對find查找出的的結果進行的一列處理,例如刪除,復制等。

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

注意:find傳遞查找到的文件路徑至后面的命令時,是先查找出所有符合條件的文件路徑,並一次性傳遞給后面的命令;
但是有些命令不能接受過長的參數,此時命令執行會失敗;另一種方式可規避此問題:
find | xargs COMMAND
xargs命令通俗來講就是將標准輸入轉成各種格式化的參數,所以命令[command 1] | xargs [command 2]就是將command 1的標准輸出結果,通過管道|變成xargs的標准輸入,然后xargs再將此標准輸入變成參數,傳給[command 2]。這樣一來,通過xargs命令,我們便可以在管道后面使用那些不接收標准輸入的命令了。例如[command 1]|xargs ls。

 

1、查找/var目錄下屬主為root,且屬組為mail的所有文件或目錄;

]# find  /var  -user  root  -group  mail  -ls

8446487 0 drwxrwxr-x 2 root mail 260 10月 29 11:48 /var/spool/mail
9436072 4 -rw——- 1 root mail 680 10月 29 11:48 /var/spool/mail/root

2、查找/usr目錄下不屬於root, bin或hadoop的所有文件或目錄;用兩種方法;

]# find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls   注意小括號前后的空格

]# find /usr -not -user root -not -user bin -not -user hadoop -ls

3、查找/etc目錄下最近一周內其內容修改過,且屬主不是root用戶也不是hadoop用戶的文件或目錄;

]# find /etc -mtime -7 -a -not ( -user root -o -user hadoop ) -ls

]# find /etc -mtime -7 -a -not -user root -a -not -user hadoop -ls

4、查找當前系統上沒有屬主或屬組,且最近一周內曾被訪問過的文件或目錄;

]# find / ( -nouser -o -nogroup ) -atime -7 -ls

82 0 drwx—— 2 1006 distro 62 10月 3 17:35 /home/mandriva
4215538 0 drwx—— 2 we55 2050 76 10月 24 11:33 /home/we55
4215539 4 -rw-r–r– 1 we55 2050 18 9月 7 00:25 /home/we55/.bash_logout
……..

5、查找/etc目錄下大於1M且類型為普通文件的所有文件;

]# find /etc -size +1M -type f -exec ls -lh {};

6、查找/etc目錄下所有用戶都沒有寫權限的文件;

]# find /etc -not -perm /222 -type f -ls

7、查找/etc目錄至少有一類用戶沒有執行權限的文件;

]# find /etc -not -perm -111 -type f -ls

8、查找/etc/init.d/目錄下,所有用戶都有執行權限,且其它用戶有寫權限的所有文件;

]# find /etc -perm -113 -type f -ls

9、查找/test下的.txt的普通文件,不查找子目錄。

] # find /test ! -name “test” -type d -prune -o -type f -name “*.txt” -print

查找當前目錄下的普通文件,不查找子目錄

] # find . ! -name “.” -type d -prune -o -type f -print

-maxdepth<目錄層級>:設置最大目錄層級; -mindepth<目錄層級>:設置最小目錄層級,設定查找目標的目錄查找層級,有利於加快查找速度。
例如:查找/etc一級目錄下的所有txt文件,不查找子目錄里面的文件。
-prune 排除指定某個不要進行查找的目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM