Linux文件查找locate/find命令詳解


  Linux文件查找命令有locate 和 find。find命令是我們日常工作中比較常用的Linux命令。全面的掌握這個命令可以使很多操作達到事半功倍的效果。

一.locate:非實時,模式匹配,查找是根據全系統文件數據庫數據庫進行的。查找速度快。

  updatedb:手動生成文件數據庫(若新裝的linux系統,此時沒有文件數據庫,可用updatedb命令手動生成)

二.find:實時,精確,支持眾多查找標准,遍歷指定目錄中的所有文件完成查找,速度慢。

  find的用法:find  查找路徑  查找標准  查找到后的處理動作

    查找路徑:默認為當前目錄

    查找標准:默認為指定路徑下的所有文件

    處理動作:默認為顯示。

  1.查找標准

    (1) -name 'FILENAME':對文件名作精確匹配

     
文件名通配
    *:任意長度的任意字符
    ?:任意單個字符
    []:指定范圍內的任意單個字符  [a-m],[A-Z] ,[0-9],[a-zA-Z]
        [:space:]:空白字符
        [:punct:]:標點符號
        [:lowe:] :小寫字符     "[[:lower:]]" instead of "[a-z]"
        [:upper:]:大寫字母
        [:alpha:]:大小寫字母
        [:digit:]:數字
        [:alnum:]:數字和大小寫字母
        使用 man 7 glob 可以獲得以上列表
    [^]:配置指定范圍之外的任意單個字符  例如 : [^0-9]*  表示 匹配非數字開頭的文件
文件名通配符
     
-name 'FILENAME' 查找事例
1.在/home/xiaobao/CommandTest/find 下 創建a123,cd6,c79m,c1 my,m.z,k 67,8yu,789等文件,以上文件是以逗號隔開的,其他部分都是文件名的組成部分。
     [xiaobao@libaoliang find]$ touch a123 cd6 c79m c1 my m.z k 67 8yu 789
    [xiaobao@libaoliang find]$ cd /home/xiaobao/CommandTest/find/
    [xiaobao@libaoliang find]$ ls -l
    total 0
    -rw-r--r--. 1 xiaobao policeman 0 Jun 15 17:07 789
    -rw-r--r--. 1 xiaobao policeman 0 Jun 15 17:07 8yu
    -rw-r--r--. 1 xiaobao policeman 0 Jun 15 17:07 a123
    -rw-r--r--. 1 xiaobao policeman 0 Jun 15 17:07 c1 my
    -rw-r--r--. 1 xiaobao policeman 0 Jun 15 17:07 c79m
    -rw-r--r--. 1 xiaobao policeman 0 Jun 15 17:07 cd6
    -rw-r--r--. 1 xiaobao policeman 0 Jun 15 17:07 k 67
    -rw-r--r--. 1 xiaobao policeman 0 Jun 15 17:07 m.z
到此 文件創建成功
2.查找所有/home/xiaobao/CommandTest/find目錄下以a或m開頭的文件
    [xiaobao@libaoliang find]$ find /home/xiaobao/CommandTest/find/ -name '[am]*'
    切換到 /home/xiaobao/CommandTest/find/目錄,直接執行
    [xiaobao@libaoliang find]$ find  -name '[am]*'
    ./m.z
    ./a123
3.顯示所有文件名中包含了數字的文件
   [xiaobao@libaoliang find]$ find -name '*[0-9]*'
    或
    [xiaobao@libaoliang find]$ find -name '*[[:digit:]]*'
    ./c1 my
    ./c79m
    ./cd6
    ./8yu
    ./789
    ./k 67
    ./a123
4.顯示文件名中包含了非字母或數字的特殊符號文件
    [xiaobao@libaoliang find]$ find -name '*[^[:alnum:]]*'
    或
    [xiaobao@libaoliang find]$ find -name '*[^a-zA-Z0-9]*'
    .
    ./c1 my
    ./m.z
    ./k 67
-name 'FILENAME' 查找事例

    (2) -iname 'FILENAME':文件名匹配不區分大小寫    

     
1.查找a開頭文件(重點測試 部分大小寫)
   [xiaobao@libaoliang find]$ find -iname 'a*'
    或
    [xiaobao@libaoliang find]$ find -iname 'A*'
    ./a123
   都可以找到文件a123
-iname 'FILENAME'查找事例

    (3) -regex PATTERN:基於正則表達式進行文件名匹配

     
基本正則表達式(默認貪婪模式):Regular EXPression,REGRXP
    元字符:
        .  : .表示任意單個字符
    匹配次數
        * :匹配其前面字符任意次(貪婪模式,默認情況下,匹配最長的匹配)
            .*:任意長度的任意字符
        \?:匹配其前面的字符1次或0次
        \{m,n\}:匹配其前面的字符最少m次,最多n次
    位置錨定
        ^:錨定行首,此字符后面的任意內容必須出現在行首
        $:錨定行尾,此字符前面的任意內容必須出現在行尾
            ^$:空白行
        \< 或 \b:錨定詞首,其后面的任意字符必須作為單詞首部出現
        \> 或 \b:錨定詞尾,其前面的任意字符必須作為單詞尾部出現
    []:匹配指定范圍內的任意單個字符
    [^]:匹配指定范圍外的任意單個字符
    字符集合 
        [:digit:]  數字,[:lower:] 小寫字符,[:upper:] 大寫字符,[:punct:] 標點符號,[:space:] 空白字符,[:alpha:] 大小寫字符,[:alnum:] 數字 大小寫字母
    分組:
        \( \):分組,主要用於后向引用,
        \1:表示 引用第一個括號匹配 出現過的內容
        \2:表示 引用第二個括號匹配 出現過 的內容
擴展表達式
    字符匹配
        .  : .表示任意單個字符
        []:匹配指定范圍內的任意單個字符
        [^]:匹配指定范圍外的認字單個字符
    次數匹配
       * :匹配其前面字符任意次
        ?:匹配其前面的字符1次或0次
        +:匹配其前面的字符最少1次
        {m,n} 匹配其前面的字符最少m次,最多n次
    位置錨定
        ^:錨定行首,此字符后面的任意內容必須出現在行首
        $:錨定行尾,此字符前面的任意內容必須出現在行尾
       \< :錨定詞首,其后面的任意字符必須作為單詞首部出現
        \> :錨定詞尾,其前面的任意字符必須作為單詞尾部出現    
    分組:
        ():分組
        \1,\2,\3 :表示對前面分組的引用
    或者
        |: 表示或者
正則表達式
    1.顯示所有以數字結尾且文件名中不包含空白的文件
    [xiaobao@libaoliang find]$ find ./ -regextype posix-extended -regex '[^[:space:]]*[0-9]+'
    必須要指定 regextype type,否則無法正確匹配

    (4) -user USERNAME:根據屬主查找

    ls /home/xiaobao/
     
drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 21:15 Desktop
drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Documents
drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Downloads
-rw-r--r--. 1 root    root       191 May 18 17:46 dump.rdb
drwxr-xr-x. 3 xiaobao policeman 4096 Apr 22 20:04 java
drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Music
-rw-r--r--. 1 xiaobao policeman 1998 Apr 25 23:36 mycal
-rw-r--r--. 1 root    root        31 May 25 20:53 myfile.txt
-rw-rw-r--. 1 xiaobao policeman  252 May 10 21:44 mytest1.java
-rw-r--r--. 1 root    root        97 May 10 16:16 mytest2.java
drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Pictures
drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Public
-rw-r--r--. 1 root    root      1358 Apr 27 21:22 ShowUsers.class
-rw-r--r--. 1 root    root       744 Apr 27 21:22 ShowUsers.java
drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Templates
drwxr-xr-x. 2 root    root      4096 May 24 17:46 testWildcard
drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Videos
ls /home/xiaobao/結果

      find  /home/xiaobao/ -user root

     
/home/xiaobao/.showUsers.java.swp
/home/xiaobao/myfile.txt
/home/xiaobao/ShowUsers.java
/home/xiaobao/testWildcard
/home/xiaobao/testWildcard/c1 my
/home/xiaobao/testWildcard/c79m
/home/xiaobao/testWildcard/測試通配符.txt
/home/xiaobao/testWildcard/m.z
/home/xiaobao/testWildcard/cd6
/home/xiaobao/testWildcard/8yu
/home/xiaobao/testWildcard/789
/home/xiaobao/testWildcard/k 67
/home/xiaobao/testWildcard/a123
/home/xiaobao/testWildcard/67
/home/xiaobao/ShowUsers.class
/home/xiaobao/dump.rdb
/home/xiaobao/mytest2.java
find /home/xiaobao -user root結果

     (5) -group GROUPNAME:根據屬組查找   

    ls /home/xiaobao/
     
改變mytest1.java文件的屬組
    [root@libaoliang xiaobao]# chgrp xiaoming mytest1.java 
查看文件情況
    [root@libaoliang xiaobao]# ls /home/xiaobao/ -l
    total 72
    drwxr-xr-x. 3 xiaobao policeman 4096 Jun 15 17:05 CommandTest
    drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 21:15 Desktop
    drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Documents
    drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Downloads
    -rw-r--r--. 1 root    root       191 May 18 17:46 dump.rdb
    drwxr-xr-x. 3 xiaobao policeman 4096 Apr 22 20:04 java
    drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Music
    -rw-r--r--. 1 xiaobao policeman 1998 Apr 25 23:36 mycal
    -rw-r--r--. 1 root    root        31 May 25 20:53 myfile.txt
    -rw-rw-r--. 1 xiaobao xiaoming   252 May 10 21:44         mytest1.java
    -rw-r--r--. 1 root    root        97 May 10 16:16 mytest2.java
    drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Pictures
    drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Public
    -rw-r--r--. 1 root    root      1358 Apr 27 21:22 ShowUsers.class
    -rw-r--r--. 1 root    root       744 Apr 27 21:22 ShowUsers.java
    drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Templates
    drwxr-xr-x. 2 root    root      4096 May 24 17:46 testWildcard
    drwxr-xr-x. 2 xiaobao policeman 4096 Apr 22 19:53 Videos
ls /home/xiaobao/ -l 結果

     [root@libaoliang xiaobao]# find ./ -group xiaoming -ls

     
[root@libaoliang xiaobao]# find ./ -group xiaoming -ls
782498    4 -rw-rw-r--   1 xiaobao  xiaoming      252 May 10 21:44 ./mytest1.java
791771    0 -rw-r--r--   1 xiaobao  xiaoming        0 Jun 15 17:07 ./CommandTest/find/c79m

這里 find命令最后跟 -ls,可以使查找出來的結果以詳細格式顯示,相當於使用 ls -l 命令
find ./ -group xiaoming -ls執行結果  

    (6)-uid UID:根據UID查找
       -gid GID:根據GID查找

     
查看 xiaoming 用戶的 uid 和 gid
    [root@libaoliang xiaobao]# id xiaoming
    uid=501(xiaoming) gid=501(xiaoming) groups=501(xiaoming)
-gid事例
    [root@libaoliang xiaobao]# find ./ -gid 501 -ls
    782498    4 -rw-rw-r--   1 xiaobao  xiaoming      252 May 10 21:44 ./mytest1.java
    791771    0 -rw-r--r--   1 xiaobao  xiaoming        0 Jun 15 17:07 ./CommandTest/find/c79m

uid 和 gid使用方法類似
-uid 和 -gid事例

    (7)-nouser:查找沒有屬主的文件

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

     
用testuser 用戶在/home/testuser目錄下創建 aaa文件,用root用戶使用userdel testuser命令刪除testuser用戶, 這時候usertest用戶被刪除,但是家目錄及文件還存在,這時候,aaa文件即已經成為無屬主 和 無屬組的文件。
[root@libaoliang xiaobao]# ls /home/testuser/ -l
 total 0
-rw-rw-r--. 1 4007 4007 0 Jun 15 21:03 aaa

[root@libaoliang xiaobao]# find /home/testuser/ -nouser
/home/testuser/
/home/testuser/.bash_logout
/home/testuser/.mozilla
/home/testuser/.mozilla/plugins
/home/testuser/.mozilla/extensions
/home/testuser/.bash_profile
/home/testuser/.bashrc
/home/testuser/aaa
/home/testuser/.gnome2
/home/testuser/.bash_history

[root@libaoliang xiaobao]# find /home/testuser/ -nogroup
/home/testuser/
/home/testuser/.bash_logout
/home/testuser/.mozilla
/home/testuser/.mozilla/plugins
/home/testuser/.mozilla/extensions
/home/testuser/.bash_profile
/home/testuser/.bashrc
/home/testuser/aaa
/home/testuser/.gnome2
/home/testuser/.bash_history
View Code    

    (8) -type
      f:普通文件
      d:目錄
      c:字符設備
      b:塊設備
      l:連接文件

      p:管道設備
      s:套接字設

     
[root@libaoliang testWildcard]# find /home/xiaobao/testWildcard/ -type f -ls
786367    0 -rw-r--r--   1 root     root            0 May 24 17:45 /home/xiaobao/testWildcard/c1\343\200\200my
786365    0 -rw-r--r--   1 root     root            0 May 24 17:45 /home/xiaobao/testWildcard/c79m
782449    4 -rw-r--r--   1 root     root          532 May 24 18:05 /home/xiaobao/testWildcard/\346\265\213\350\257\225\351\200\232\351\205\215\347\254\246.txt
786372    0 -rw-r--r--   1 root     root            0 May 24 17:46 /home/xiaobao/testWildcard/m.z
786364    0 -rw-r--r--   1 root     root            0 May 24 17:44 /home/xiaobao/testWildcard/cd6
786380    0 -rw-r--r--   1 root     root            0 May 24 17:46 /home/xiaobao/testWildcard/8yu
786387    0 -rw-r--r--   1 root     root            0 May 24 17:46 /home/xiaobao/testWildcard/789
786374    0 -rw-r--r--   1 root     root            0 May 24 17:46 /home/xiaobao/testWildcard/k\343\200\20067
786358    0 -rw-r--r--   1 root     root            0 May 24 17:44 /home/xiaobao/testWildcard/a123
786377    0 -rw-r--r--   1 root     root            0 May 24 17:46 /home/xiaobao/testWildcard/67
-type使用事例

    (9) -size
      [+|-]#k:例如 1k表示小於等於1k,+10k表示大於10k,-10表示小於10k
      #M
      #G

    
[root@libaoliang testWildcard]# find -size -10k
.
./c1 my
./c79m
./測試通配符.txt
./m.z
./cd6
./8yu
./789
./k 67
./a123
./67
-size使用事例

    (10) 組合條件
      -a:與;不寫符號的話,默認為 -a 與關系
      -o:或
      -not:非

    1.查找/tmp目錄下,不是目錄 並且 不是套接字類型的文件
        find /tmp -not -type d -a -not -type s
    2./tmp目錄下,屬主不是user1又不是user2的文件
        find /tmp -not -user user1 -a -not -user user2
    3./tmp目錄下,屬主不是user1 或者 類型不是目錄的
        find /temp -not -user user1 -o -not -type d

    (11) 時間

      -ctime:以天為單位通過change time查找文件。
      -atime:以天為單位通過access time查找文件。
      -mtime:以天為單位通過modify time查找文件。
      -mmin:以分鍾為單位通過modify time查找文件。
      -amin:以分鍾為單位通過access time查找文件。
      -cmin:以分鍾單位通過change time查找文件。

      [+|-]#:例如:-atime -5:表示5天內訪問過的文件
           -atime 5 :表示 離當前時間剛好5天的那一刻訪問的我文件
           -atime +5 :表示5天之外(5天之前)訪問過的往文件

     1. 查找5天前改變過的文件
        [root@libaoliang testWildcard]# find /home/xiaobao/testWildcard/ -ctime +5 -ls
        798393    4 drwxr-xr-x   2 root     root         4096 May 24 17:46 /home/xiaobao/testWildcard/
        786372    0 -rw-r--r--   1 root     root            0 May 24 17:46 /home/xiaobao/testWildcard/m.z
        786364    0 -rw-r--r--   1 root     root            0 May 24 17:44 /home/xiaobao/testWildcard/cd6
        786380    0 -rw-r--r--   1 root     root            0 May 24 17:46 /home/xiaobao/testWildcard/8yu
        786387    0 -rw-r--r--   1 root     root            0 May 24 17:46 /home/xiaobao/testWildcard/789
        786358    0 -rw-r--r--   1 root     root            0 May 24 17:44 /home/xiaobao/testWildcard/a123
        786377    0 -rw-r--r--   1 root     root            0 May 24 17:46 /home/xiaobao/testWildcard/67
     2.查找5天內訪問過的文件
        [root@libaoliang testWildcard]# find /home/xiaobao/testWildcard/ -atime -5
        /home/xiaobao/testWildcard/
        /home/xiaobao/testWildcard/測試通配符.txt

     (12)按權限查找

      
    [root@libaoliang testWildcard]# ls -l
    total 4
    -rwxrwxr--. 1 root root   0 May 24 17:46 67
    -rwxrwxr--. 1 root root   0 May 24 17:46 789
    -rwxrwxr--. 1 root root   0 May 24 17:46 8yu
    -rwxrw-r-x. 1 root root   0 May 24 17:44 a123
    -rwxrw-r-x. 1 root root   0 May 24 17:45 c1 my
    -rwxrw-r-x. 1 root root   0 May 24 17:45 c79m
    -rw-r--r--. 1 root root   0 May 24 17:44 cd6
    -rw-r--r--. 1 root root   0 May 24 17:46 k 67
    -rw-r--r--. 1 root root   0 May 24 17:46 m.z
    -rw-r--r--. 1 root root 532 May 24 18:05 測試通配符.txt
ls -l

      -perm MODE :精確匹配,嚴格匹配。

        
    [root@libaoliang testWildcard]# find ./ find -perm 764
    ./c1 my
    ./c79m
    ./a123
find ./ -perm 764查找結果

      -perm -MODE:文件權限能完全包含此MODE時才能顯示,表示mode中轉換成二進制的1在文件權限位里面必須匹配

        
    [root@libaoliang testWildcard]# find ./ find -perm -764
    ./c1 my
    ./c79m
    ./8yu
    ./789
    ./a123
    ./67
find ./ -perm -764查找結果

      -perm +MODE :(和 -perm /MODE 效果一樣)只要有一位匹配到即可,任意匹配一位即可

        
    [root@libaoliang testWildcard]# find ./ -perm +010 -ls
    798393    4 drwxr-xr-x   2 root     root         4096 May 24 17:46 ./
    786380    0 -rwxrwxr--   1 root     root            0 May 24 17:46 ./8yu
    786387    0 -rwxrwxr--   1 root     root            0 May 24 17:46 ./789
    786377    0 -rwxrwxr--   1 root     root            0 May 24 17:46 ./67
find ./ -perm +010 -ls查找結果

    (13)-newer f1 !f2 匹配比文件f1新卻比f2舊的文件

    (14)-prune 忽略某個目錄

 

 

 2.處理動作:
    -print:顯示
    -ls:類似 ls -l的形式顯示每一個文件的詳細
    -ok COMMAND {}\; : {}表示占位符,必須以\;結尾,每次操作都需要用戶確認
    -exec COMMAND {} \;
      例如: find ./ -perm 006 -exec chmod o-w {} \; :將所有其他組中所有具有讀寫權限的文件,去掉寫權限
      find ./ -perm -020 -ok mv {} {}.new \; :將所有具有寫權限的文件,重命名為原文件名加 .new
      find ./ -name "*.sh" -a -perm -111 -exec chmod o-x {} \; :找到也.sh結尾 而且所有用戶都有執行權限,把其他用戶的執行權限去掉

 

 

find命令練習

  1.查找/var目錄下屬主為root並且屬組為mail的所有文件

     [root@libaoliang ~]# find /var -user root -group mail -ls 

  2.查找/user目錄下不屬於root,bin 或 student的文件

     [root@libaoliang ~]# find /usr/ -not -user root -a -not -user bin -a -not -user student -ls 

     [root@libaoliang ~]# find /user -not \(-user -root -o -user bin -o -user student\) 
  3.查找/etc目錄下最近一周內內容修改過且不屬於root及student用戶的文件

     [root@libaoliang ~]# find /etc/ -mtime -7 -a -not -user root -a -not -user student 

     [root@libaoliang ~]# find /etc/ -mtime -7 -a -not \( -user root -o -user student\) 
  4.查找當前系統上沒有屬組或屬組且最近一天內層被訪問過的文件,並將其屬主屬組均修改為root

     [root@libaoliang ~]# find / \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \; 
  5.查找/etc目錄下大於1M的文件,並將其文件名寫入/tmp/etc.largefiles文件中

     [root@libaoliang ~]# find /etc/ -size +1M >> /tmp/etc.largefiles 

     [root@libaoliang ~]# find /etc/ -size +1M | xargs echo >> /tmp/etc.largefiles #多個文件名以空格分割字符串顯示在一行 
  6.查找/etc目錄下所有用戶都沒有寫權限的文件,顯示出其詳細信息

     [root@libaoliang ~]# find /etc/ -not -perm /222 -ls 


免責聲明!

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



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