首頁 > 軟體

Linux基礎知識之find命令詳解

2020-06-16 17:36:43

在運維人員作業系統時,要接觸大量的檔案,為了避免忘記檔案存放位置的尷尬,就需要我們有一種檔案查詢工具的幫忙,下面是兩個檔案查詢工具的詳解,locate以及find,分別分享給大家。

第一款工具: Locate

locate - find files by name

locate的工作依賴於事先構建好的索引庫;查詢檔案時,直接搜尋索引庫裡記載的檔案的位置;

索引庫的構建:

 系統自動實現(周期性任務);

 手動更新資料庫(updatedb),但是索引構建的過程需要遍歷整個檔案系統,極其耗費系統資源;

    updatedb - update a database for mlocate;

工作特性:

  查詢速度快,但不一定精確,無法匹配到資料庫建立後的建立檔案;

  非實時查詢,不能實時反饋當前檔案系統上的檔案狀態 ;

使用方法:

  locate [OPTIONS] FILE..

   選項:

   -c:統計查詢結果的數量

    -b:只匹配路徑中的基名

   -r:基於基本正規表示式寫匹配模式

1
2
3
4
5
6
7
8
9
10
11
12
[root@linuxidc ~]# locate -c  "passwd"
165
[root@linuxidc ~]# locate -c  "inittab"
4
  
[root@linuxidc ~]# locate -b  "inittab"
/etc/inittab
/usr/local/share/man/zh_CN/man5/inittab.5
/usr/share/augeas/lenses/dist/inittab.aug
/usr/share/vim/vim74/syntax/inittab.vim
  
[root@linuxidc ~]# locate -r  "/passwd

第二款工具:Find

find: find - search for files in a directory hierarchy

工作方式:通過遍歷指定起始路徑下檔案系統層級結構完成檔案查詢;

工作特性:

  查詢速度慢;

  精確查詢;

  實時查詢;

使用方法:

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

fing [OPTIONS] [查詢起始路徑] [查詢條件] [處理動作]

查詢起始路徑:指定具體搜尋目標起始路徑;預設當前目錄;

查詢條件:指定的查詢標準,可以根據檔名,大小,型別,從屬關係,許可權等標準,預設為指定目錄下的所有條件

處理動作:對符合條件的檔案作出的操作,例如刪除等操作,預設為輸出至標準輸出

查詢條件說明: 

以表示式的形式,包含選項和測試條件

  測試:結果通常為布林型資料("true""fales")

   (1)根據檔名查詢 注意:支援glob風格的萬用字元

    -name "pattern":區分大小寫

    -iname "pattern":不區分名字的大小寫,

    -regex "patten":基於正規表示式模式查詢檔案,匹配是整個路徑 ,而非其名;

           

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        [root@linuxidc ~]# find /etc -iname "passwd"
        /etc/passwd
        /etc/pam.d/passwd
        [root@linuxidc ~]# find /etc -iname "*passwd"
        /etc/passwd
        /etc/pam.d/passwd
        /etc/security/opasswd
        [root@linuxidc ~]# find /etc -iname "passwd*"
        /etc/passwd
        /etc/passwd-
        /etc/pam.d/passwd
        [root@linuxidc ~]# find /etc -iname "passwd?"
        /etc/passwd-
        [root@linuxidc ~]# find /etc -iname "passwd[[:place:]]"
        [root@linuxidc ~]#

 

 

   (2)根據檔案從屬關係查詢

      -user username:查詢屬主指定使用者的所有檔案;

      -group groupname: 查詢屬組指定使用者的所有檔案;

     -uid UID:查詢屬主指定UID的所有檔案;

     -gid GID:查詢屬組指定GID的所有檔案;        #find /etc  -gid 5000

     -nouser:查詢沒有屬主的檔案                     #find /etc  -nouser

     -ngroup:查詢沒有屬組的檔案                    #find /etc  -nogroup

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
       [root@linuxidc ~]# find /var/tmp/ -user CentOS          #屬主查詢
        /var/tmp/test/a.centos
        /var/tmp/test/b.centos
        
       [root@linuxidc ~]# find /var/tmp/ -group mygrp -ls      #屬組查詢
        drwxrwsr-t   2 root     mygrp          66 Jul 31 04:43 /var/tmp/test
        -rw-rw-r--   1 centos   mygrp          10 Jul 31 04:43 /var/tmp/test/b.centos
        -rw-rw-r--   1 Fedora   mygrp           0 Jul 31 04:43 /var/tmp/test/b.fedora
         
       [root@linuxidc ~]# id  centos                            #UID查詢
        uid=1001(centos) gid=1001(centos) groups=1001(centos),1003(mygrp)
        [root@linuxidc ~]# find /var/tmp/ -uid 1001
        /var/tmp/test/a.centos
        /var/tmp/test/b.centos
          
        [root@linuxidc ~]# tail -n2 /etc/group                  #GID查詢
        mygrp:x:1003:centos,fedora
        hodoop:x:1004:
        [root@linuxidc ~]# find /var/tmp/ -gid 1003 
        /var/tmp/test
        /var/tmp/test/b.centos
        /var/tmp/test/b.fedora
          
        [root@linuxidc ~]# find /etc  -nouser                #沒有屬主
        [root@linuxidc ~]# find /etc  -nogroup                #沒有屬組

   (3)根據檔案型別查詢

     -trpe TYPE: 組合動作-ls使用,檢視檔案的詳細資訊

      f:普通檔案

      d:目錄   

      l:連結檔案

      b:塊裝置檔案

      c:字元裝置檔案

      s:通訊端檔案

      p:管道檔案

      組合測試:

      與: -a 預設組合操作邏輯:  二者同時成立

      或: -o  符合其中一項即可

      非: -not 或"!"  取反      

       !A -a !B=!(A -o B)

       !A -o !B=!(A -a B)

   練習: 找出/etc/下 屬主非root的檔案,且檔名中不包含fstab    

1
2
3
4
[root@linuxidc ~]# find /etc/   !  -user root -ls -a -not -name "fatab"
1233465    0 drwx------   2 polkitd  root           63 7月 19 19:07 /etc/polkit-1/rules.d
34785013    8 -rw-------   1 tss      tss          7046 11月 21  2015 /etc/tcsd.conf
35135850    0 drwx--x--x   2 sssd     sssd            6 11月 20  2015 /etc/sssd

 

   (4)根據檔案大小查詢 

     -siza[+|-]#UNIT: 常用單位:k,m,g

      #UNIT: (#-1,#]     等於數位

      -#UNIT:[0,#-1)   小於數位

      +#UNIT:(#,00)    大於數位

      -empty: 查詢空檔案。

1
2
3
4
5
6
7
8
9
[root@linuxidc var]# find /etc/ -size -4k -a -exec ls -lh {} ;
-rw-r--r--. 1 root root 465 7月  19 18:59 /etc/fstab
-rw-------. 1 root root 0 7月  19 18:59 /etc/crypttab
lrwxrwxrwx. 1 root root 17 7月  19 18:59 /etc/mtab -> /proc/self/mounts
-rw-r--r-- 1 root root 228 7月  30 18:31 /etc/resolv.conf
  
[root@linuxidc usr]# find /etc/ -size 4k -a -exec ls -lh {} ;
  
[root@linuxidc usr]# find /etc/ -size 4k -a -exec ls -lh {} ;

   (5)根據時間戳查詢

     以天為單位

       -atime   [+|-]# : [#,#-1] 

       -mtime                           

       -ctime

    以分鐘為單位

       -amin

       -mmin

       -cmin

   (6)根據許可權查詢

     -perm [/|-]mode:

        mode:精確查詢 -perm -664 檔案許可權正好符合mode(mode為檔案許可權的八進位制表示)。

       /mode:任何一類使用者(u,g,o)許可權中的任何一位(rwx)符合條件即滿足  檔案許可權部分符合mode

         9位許可權之間存在"或"關係

       -mode:每一類使用者(u,g,o)的許可權中的每一位(e,w,x)同時符合條件即滿足;

         9位許可權之間存在"與"關係檔案許可權完全符合mode。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@linuxidc ~]# find . -perm 644
./.bash_logout
./.bashrc
./.cshrc
./.tcshrc
  
[root@linuxidc ~]# find . -perm -644
./.bash_logout
./.bashrc
./.cshrc
./.tcshrc
./.cache/abrt
./.cache/abrt/applet_dirlist
  
[root@linuxidc ~]# find /tmp/ -perm /222 
/tmp/
/tmp/log
/tmp/log/tallylog
/tmp/log/lastlog

 

處理動作

 -print:輸出至標準輸出,預設的動作

 -ls:類似於對查詢到的檔案執行"ls -l"命令,輸出檔案的詳細資訊.

 -delete:刪除查詢到的檔案;

 -fls /path/to/SomeFIle:把查詢到的所有檔案的長格式資訊儲存至指定檔案中

 -ok COMMAND {} ;  :對查詢的每個檔案執行有COMMAND表示的命令;每次操作都有使用者進行確認;

 -exec COMMAND {} ; :對查詢的每個檔案執行有COMMAND表示的命令;

   注意: find傳遞查詢到的檔案路徑至後面的命令時,是先查詢出所有符合條件的檔案路徑,並一次性傳遞給後面的命令;

   但是有些命令不能接受過長的引數,此時命令執行會失敗;另一種方式可規避此問題.

      find | xargs COMMAND       學習xargs命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@linuxidc ~]# find /tmp -name "qwe.sh"  -type f -delete
[root@linuxidc ~]# ls /tmp/
hogsuspend  log
   
[root@linuxidc ~]# find /etc/ ! -perm /222  -type f -fls /tmp/qwe.sh
[root@linuxidc ~]# cat /tmp/qwe.sh
33885564  196 -r--r--r--   1 root     root       198453 7月 19 19:02 /etc/pki/ca-trust/extracted/java/cacerts
67923558  352 -r--r--r--   1 root     root       359773 7月 19 19:02 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
  
[root@linuxidc ~]# find /etc/ ! -perm /222  -type f -ok ls -lh {} ;
ls ... /etc/pki/ca-trust/extracted/java/cacerts > ? y
-r--r--r--. 1 root root 194K 7月  19 19:02 /etc/pki/ca-trust/extracted/java/cacerts
ls ... /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt > ? y
-r--r--r--. 1 root root 352K 7月  19 19:02 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
ls ... /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem > ? y
  
[root@linuxidc ~]# find /etc/ ! -perm /222  -type f -exec ls -lh {} ;
-r--r--r--. 1 root root 194K 7月  19 19:02 /etc/pki/ca-trust/extracted/java/cacerts
-r--r--r--. 1 root root 352K 7月  19 19:02 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
-r--r--r--. 1 root root 261K 7月  19 19:02 /etc/pki/ca-trust/extracted/pem/tls-

 

xargs命令:

    該命令的主要功能是從輸入中構建和執行shell命令。       
     在使用find命令的-exec選項處理匹配到的檔案時,   find命令將所有匹配到的檔案一起傳遞給exec執行。但有些系統對能夠???遞給exec的命令長度有限制,這樣在find命令執行幾分鐘之後,就會出現 溢位錯誤。錯誤資訊通常是“引數列太長”或“引數列溢位”。這就是xargs命令的用處所在,特別是與find命令一起使用。  
    find命令把匹配到的檔案傳遞給xargs命令,而xargs命令每次只獲取一部分檔案而不是全部,不像-exec選項那樣。這樣它可以先處理最先獲取的一部分檔案,然後是下一批,並如此繼續下去。  
    在有些系統中,使用-exec選項會為處理每一個匹配到的檔案而發起一個相應的進程,並非將匹配到的檔案全部作為引數一次執行;這樣在有些情況下就會出現進程過多,系統效能下降的問題,因而效率不高;  
    而使用xargs命令則只有一個進程。另外,在使用xargs命令時,究竟是一次獲取所有的引數,還是分批取得引數,以及每一次獲取引數的數目都會根據該命令的選項及系統核心中相應的可調引數來確定。
    #查詢當前目錄下的每一個普通檔案,然後使用xargs命令來測試它們分別屬於哪類檔案。 

1
2
3
4
5
root@linuxidc ~]# find . -type f -print | xargs file
    ./users2:        ASCII text
    ./datafile3:      empty
    ./users:          ASCII text
    ./test.tar.bz2: bzip2 compressed data, block size = 900k

   #回收當前目錄下所有普通檔案的執行許可權。

1
2
3
4
5
6
7
8
[root@linuxidc ~]# find . -type f -print|xargs chmod a-x
[root@linuxidc ~]# ll 
總用量 8
-rw-r--r-- 1 root root    0 7月  30 11:38 ad
-rwSr--r-- 1 root root 2620 7月  24 10:10 passwd.bak
drwxr-xr-x 2 root root    6 7月  30 12:31 qwe
drwxr-xr-x 2 root root 4096 7月  29 20:10 shell
drwxr-xr-x 2 root root  125 7月  30 16:02 shlianxi

    #在當面目錄下查詢所有普通檔案,並用grep命令在搜尋到的檔案中查詢hostname這個詞 

1
[root@linuxidc ~]# find /etc -type f -print | xargs grep "hostname"

練習:

1.查詢/var/目錄下屬主為root,且陣列為mall的所有檔案或目錄;   

1
2
3
[root@linuxidc ~]# find /var/ -user root -a -group mail
/var/spool/mail
/var/spool/mail/root

   2.查詢/usr目錄下不屬於root,bin,或Hadoop的所有檔案或目錄,用兩種方法

[root@linuxidc ~]# find /usr/ -not ( -user root -o -user bin -o -user hadoop)

[root@linuxidc ~]# find /usr/ -not -user root -a -not -user bin -a not -usr hadoop

3.查詢/etc/目錄下最近一週內其檔案修改過,且屬主不是root使用者也不是hadoop使用者的檔案或目錄 

1
[root@linuxidc ~]# find / -mtime -7 -a ! -user root -a ! -user hadoop

4.查詢當前系統上沒有屬主或屬組,且最近一週內曾被存取的檔案或目錄

1
2
[root@linuxidc ~]# find / -nouser -o -nogroup -a -atime -7
[root@linuxidc ~]#find / (-nouser -o -nogroup) -atime -7 -ls

5,查詢/etc/目錄下大於1M且型別為普通檔案的所有檔案  

1
2
[root@linuxidc ~]# find  /etc/ -size +1M -a -type f -ls
[root@linuxidc ~]# find /etc/ -size +1M  -type f -exec ls -lh {} ;

6,查詢/etc/目錄下所有使用者都沒有寫許可權的檔案

1
[root@linuxidc ~]# find  /etc/ -size +1M -a -type f -ls

7.查詢/etc/目錄下至少有一類使用者沒有執行許可權的檔案      

1
[root@linuxidc ~]# find /etc/ !  -perm -111 -type -f  -ls

8.查詢/etc/init.d目錄下,所有使用者都有執行許可權,且其他使用者有寫許可權的所有檔案. 

1
2
 [root@linuxidc ~]#find /etc/ -perm -111 -a -perm  -002  -type f -ls
 [root@linuxidc ~]#find /etc/ -perm -113 -type f -ls

Linux find 命令用法總結  http://www.linuxidc.com/Linux/2015-04/116854.htm

Linux下的檔案查詢命令——find  http://www.linuxidc.com/Linux/2016-05/131826.htm

Linux下查詢檔案find命令  http://www.linuxidc.com/Linux/2014-10/108575.htm

Linux下find命令詳解 http://www.linuxidc.com/Linux/2011-08/40669.htm

文字查詢利器find的使用 http://www.linuxidc.com/Linux/2014-03/97559.htm

功能強大的find命令 http://www.linuxidc.com/Linux/2014-01/95236.htm

Linux系統find命令詳解 http://www.linuxidc.com/Linux/2014-06/103232.htm

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-08/133815.htm


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