天天看點

Linux基礎之檔案查找工具:locate、find

引言:

在學習Linux中的檔案查找時,突然聯想到平時用的搜尋引擎,在生活中我們想擷取什麼資訊,在google等搜尋引擎裡面敲入就能列出符合我們條件的相關資訊。如果我們不滿意搜尋結果可以進一步精确我們想查找内容的搜尋内容,這在Linux的檔案查找中稱為精确比對,但是如果我們雖然知道我們想要的内容,但是找不到特别精确的言辭來形容它是以隻能輸入描述性内容為搜尋條件,這種在Linux的檔案查找中可以稱為模糊比對。本文的初衷是希望這篇文章可以解決大家在使用Linux的過程中不至于因為查找某個檔案找不到而抓狂。

                                                                    實驗環境CentOS7.2

Linux查找工具

Linux中的查找工具有兩個:locate、find

locate:非實時查找,根據索引查找

find:實時查找,周遊所有檔案進行條件比對

locate

locate屬于非實時查找,它根據事先建構的索引資料庫,比對檔案資訊進而定位符合條件的檔案。

其需事先建構的索引資料庫在/var/lib/mlocate/mlocate.db,索引的建構過程需要周遊整個根檔案系統,極其耗費資源,是以其常常在系統較為空閑時進行(通常設定自動執行),也可以進行手動更新資料庫指令為:updatedb

locate的工作特性:查找速度快、模糊查找、非實時查找

指令使用格式

  locate [option]...PATTEN...

    -b:隻比對路徑中的基名

    -c:統計出共有多少個符合條件的檔案

    -r:BRE(基本正規表達式)

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

<code>[root@localhost etc]</code><code># locate -c file</code>

<code>2540</code>

<code>[root@localhost etc]</code><code># locate -b pwd</code>

<code>/etc/</code><code>.</code><code>pwd</code><code>.lock</code>

<code>/usr/bin/pwd</code>

<code>/usr/bin/pwdx</code>

<code>/usr/lib/modules/3</code><code>.10.0-327.el7.x86_64</code><code>/kernel/drivers/watchdog/hpwdt</code><code>.ko</code>

<code>/usr/lib64/cracklib_dict</code><code>.</code><code>pwd</code>

<code>/usr/lib64/python2</code><code>.7</code><code>/lib-dynload/spwdmodule</code><code>.so</code>

<code>/usr/sbin/unix_chkpwd</code>

<code>/usr/share/cracklib/cracklib-small</code><code>.</code><code>pwd</code>

<code>/usr/share/cracklib/pw_dict</code><code>.</code><code>pwd</code>

<code>/usr/share/man/man0p/pwd</code><code>.h.0p.gz</code>

<code>/usr/share/man/man1/pwd</code><code>.1.gz</code>

<code>/usr/share/man/man1/pwdx</code><code>.1.gz</code>

<code>/usr/share/man/man1p/pwd</code><code>.1p.gz</code>

<code>/usr/share/man/man3/lckpwdf</code><code>.3.gz</code>

<code>/usr/share/man/man3/ulckpwdf</code><code>.3.gz</code>

<code>/usr/share/man/man8/unix_chkpwd</code><code>.8.gz</code>

<code>/usr/share/man/overrides/de/man1/pwdx</code><code>.1</code>

<code>/usr/share/man/overrides/fr/man1/pwdx</code><code>.1</code>

<code>/usr/share/man/overrides/uk/man1/pwdx</code><code>.1</code>

<code>[root@localhost </code><code>test</code><code>]</code><code># locate -r '.*scrip2$' </code>

<code>/test/scrip2</code>

<code>[root@localhost </code><code>test</code><code>]</code><code>#</code>

上面示範了locate的三種選項的簡單用法

find

find屬于實時查找工具,通過周遊指定起始路徑下檔案系統層級結構完成檔案查找。

它的工作特性:查找速度略慢、精确查找、實時查找。

find [OPTION]... [查找路徑] [查找條件] [處理動作]

查找路徑:指定具體目标路徑;預設為目前目錄

查找條件:指定的查找标準,可以檔案名、大小、類型、權限等标準進行;預設為找出指定路徑下的所有檔案

處理動作:對符合條件的檔案做操作,預設輸出至螢幕

………………………………………………………………………………………………………………………

查找條件:

表達式:選項和測試(常為布爾型)

根據檔案名和inode查找:

    -name "檔案名稱":支援使用glob

    *, ?, [], [^]

    -iname"檔案名稱":不區分字母大小寫

    -inumn 按inode号查找

    -regex "PATTERN":基于正規表達式模式查找檔案,比對的是整個路徑而非其名

示例:查找包含有字元串“what”的檔案

<code>[root@localhost </code><code>test</code><code>]</code><code># find / -name *what* -ls</code>

<code>72662849    4 drwxr-xr-x   2 root     root         4096 7月 20 00:36 </code><code>/var/lib/yum/yumdb/v/9879449b2e44ada0445cf495a38c3fd10c942c54-virt-what-1</code><code>.13-6.el7-x86_64</code>

<code>2536807    4 -rw-r--r--   1 root     root         2836 6月 10  2014 </code><code>/var/cache/man/cat1/whatis</code><code>.1.gz</code>

<code>35799386   48 -rwxr-xr-x   1 root     root        46456 6月 10  2014 </code><code>/usr/bin/whatis</code>

<code>...</code>

根據屬主、屬組查找:

    -user USERNAME:查找屬主為指定使用者(UID)的檔案

    -group GRPNAME: 查找屬組為指定組(GID)的檔案

    -uidUserID:查找屬主為指定的UID号的檔案

    -gidGroupID:查找屬組為指定的GID号的檔案

    -nouser:查找沒有屬主的檔案

    -nogroup:查找沒有屬組的檔案

示例:檢視/下屬于使用者fedore的檔案,或沒有屬主的檔案

<code>[root@localhost </code><code>test</code><code>]</code><code># find / -user fedore -ls</code>

<code>find</code><code>: ‘</code><code>/proc/10542/task/10542/fd/6</code><code>’: 沒有那個檔案或目錄</code>

<code>find</code><code>: ‘</code><code>/proc/10542/task/10542/fdinfo/6</code><code>’: 沒有那個檔案或目錄</code>

<code>find</code><code>: ‘</code><code>/proc/10542/fd/6</code><code>’: 沒有那個檔案或目錄</code>

<code>find</code><code>: ‘</code><code>/proc/10542/fdinfo/6</code><code>’: 沒有那個檔案或目錄</code>

<code>74331703    0 -rw-rw----   1 fedore   mail            0 8月  2 21:49 </code><code>/var/spool/mail/fedore</code>

<code>1477708    4 drwx------   3 fedore   fedore       4096 8月 15 17:11 </code><code>/home/fedore</code>

<code>35996645    0 drwxr-xr-x   4 fedore   fedore         37 7月 19 23:54 </code><code>/home/fedore/</code><code>.mozilla</code>

<code>73207822    0 drwxr-xr-x   2 fedore   fedore          6 6月 10  2014 </code><code>/home/fedore/</code><code>.mozilla</code><code>/extensions</code>

<code>101849766    0 drwxr-xr-x   2 fedore   fedore          6 6月 10  2014 </code><code>/home/fedore/</code><code>.mozilla</code><code>/plugins</code>

<code>1477714    4 -rw-r--r--   1 fedore   fedore         18 11月 20  2015 </code><code>/home/fedore/</code><code>.bash_logout</code>

<code>1477721    4 -rw-------   1 fedore   fedore        152 8月 15 17:11 </code><code>/home/fedore/</code><code>.</code><code>history</code>

<code>2538688    4 -rw-r--r--   1 fedore   fedore        237 8月 15 16:45 </code><code>/home/fedore/</code><code>.bash_profile</code>

<code>2538686    4 -rw-r--r--   1 fedore   fedore        273 8月 15 16:49 </code><code>/home/fedore/</code><code>.bashrc</code>

<code>2356350    4 -rw-------   1 fedore   fedore        134 8月 15 17:01 </code><code>/home/fedore/</code><code>.Xauthority</code>

<code>[root@localhost </code><code>test</code><code>]</code><code># find / -nouser -ls</code>

<code>find</code><code>: ‘</code><code>/proc/10540/task/10540/fd/6</code><code>’: 沒有那個檔案或目錄</code>

<code>find</code><code>: ‘</code><code>/proc/10540/task/10540/fdinfo/6</code><code>’: 沒有那個檔案或目錄</code>

<code>find</code><code>: ‘</code><code>/proc/10540/fd/6</code><code>’: 沒有那個檔案或目錄</code>

<code>find</code><code>: ‘</code><code>/proc/10540/fdinfo/6</code><code>’: 沒有那個檔案或目錄</code>

<code>101603081    0 -rw-r--r--   1 4001     root            0 8月 14 14:47 </code><code>/tmp/3fstab2</code>

根據檔案類型查找:

    -type TYPE:

    f: 普通檔案

    d: 目錄檔案

    l: 符号連結檔案

    s:套接字檔案

    b: 塊裝置檔案

    c: 字元裝置檔案

    p: 管道檔案

示例:查找/test下的普通檔案

<code>[root@localhost </code><code>test</code><code>]</code><code># find /test/ -type f -ls</code>

<code>1832646    4 -rwxr-xr-x   1 root     root          399 8月 16 20:44 </code><code>/test/scrip2</code>

組合條件:

    與:-a

    或:-o

    非:-not, !

示例:查找/tmp下屬于root且檔案類型為普通檔案的檔案

<code>[root@localhost </code><code>test</code><code>]</code><code># find /tmp/ -user root -a -type f -ls</code>

<code>74330358    4 -rw-r-----   1 root     root         3092 8月 12 21:31 </code><code>/tmp/vmware-root/vmware-apploader-6127</code><code>.log</code>

<code>74330359    4 -rw-r-----   1 root     root         3092 8月 12 21:31 </code><code>/tmp/vmware-root/vmware-apploader-6135</code><code>.log</code>

根據檔案大小來查找:

    -size [+|-]#UNIT

    常用機關:k, M, G

    #UNIT: (#-1, #]

    如:6k 表示(5k,6k]

    -#UNIT:[0,#-1]

    如:-6k 表示[0,5k]

    +#UNIT:(#,∞)

    如:+6k 表示(6k,∞)

示例:查找/etc下大于1M的檔案

<code>[root@localhost </code><code>test</code><code>]</code><code># find /etc -size +1M -ls   </code>

<code>102807508 1304 -rw-------   1 root     root      1333123 8月  2 10:09 </code><code>/etc/selinux/targeted/contexts/files/file_contexts</code><code>.bin</code>

<code>36013992 3688 -rw-r--r--   1 root     root      3773309 8月  2 10:09 </code><code>/etc/selinux/targeted/policy/policy</code><code>.29</code>

<code>72664102 6852 -r--r--r--   1 root     root      7014922 7月 20 00:38 </code><code>/etc/udev/hwdb</code><code>.bin</code>

<code>34828897 1336 -rw-r--r--   1 root     root      1367395 3月  6  2015 </code><code>/etc/brltty/zh-tw</code><code>.ctb</code>

根據時間戳:

以“天”為機關;

    -atime[+|-]#,

    #: [#,#+1)

    +#: [#+1,∞]

    -#: [0,#)

    -mtime

    -ctime

以“分鐘”為機關:

    -amin

    -mmin

    -cmin

示例:查找/etc檔案夾下2天内被通路過的檔案

<code>[root@localhost </code><code>test</code><code>]</code><code># find /etc -atime -2 -ls</code>

<code>36017835    4 -rw-r--r--   1 root     root           19 7月 20 00:36 </code><code>/etc/locale</code><code>.conf</code>

<code>36017836    4 -rw-r--r--   1 root     root           22 7月 20 00:36 </code><code>/etc/hostname</code>

<code>33554565    4 -rw-r--r--   1 root     root         1309 8月 17 08:03 </code><code>/etc/tpvmlp</code><code>.conf</code>

根據權限查找:

    -perm [/|-]MODE

    MODE: 精确權限比對

    /MODE:任何一類(u,g,o)對象的權限中隻要能一位比對即可,或關系, 

    “-perm +mode”從CentOS7後被“-perm /mode”格式替代

    -MODE:每一類對象都必須同時擁有指定權限,與關系

示例:查找/tmp下至少有一類對象有寫權限的檔案

<code>[root@localhost ~]</code><code># find /tmp -perm /222 -ls</code>

<code>100663425    4 drwxrwxrwt  15 root     root         4096 8月 17 17:36 </code><code>/tmp</code>

<code>34305371    0 drwxrwxrwt   2 root     root            6 7月 20 00:04 </code><code>/tmp/</code><code>.Test-unix</code>

<code>69465462    0 drwxrwxrwt   2 root     root           15 8月 17 08:02 </code><code>/tmp/</code><code>.X11-unix</code>

<code>74098510    0 srwxrwxrwx   1 root     root            0 8月 17 08:02 </code><code>/tmp/</code><code>.X11-unix</code><code>/X0</code>

<code>101599413    0 drwxrwxrwt   2 root     root            6 7月 20 00:04 </code><code>/tmp/</code><code>.XIM-unix</code>

<code>760765    0 drwxrwxrwt   2 root     root            6 7月 20 00:04 </code><code>/tmp/</code><code>.font-unix</code>

<code>34305372    4 drwxrwxrwt   2 root     root         4096 8月 17 08:03 </code><code>/tmp/</code><code>.ICE-unix</code>

處理動作:

    -print:預設的處理動作,顯示至螢幕;

    -ls:類似于對查找到的檔案執行“ls -l”指令

    -delete:删除查找到的檔案;

    -fls /PATH/TO/SOMEFILE:查找到的所有檔案的長格式資訊儲存至指定檔案中

    -ok COMMAND {} \; 對查找到的每個檔案執行由COMMAND指定的指令;

對于每個檔案執行指令之前,都會互動式要求使用者确認

    -exec COMMAND {} \; 對查找到的每個檔案執行由COMMAND指定的指令

find傳遞查找到的檔案路徑至後面的指令時,是先查找出所有符合條件的檔案路徑,并一次性傳遞給後面的指令;但是有些指令不能接受過長的參數,此時指令執行可能會失敗,下面方式可規避此問題

    find | xargs COMMAND

示例:1)查找/test下名為scrip2的檔案,并用cat檢視其内容,使用兩種方式;2)将搜尋到的scrip2檔案的長格式資訊儲存在/test/scrip1中

<code>[root@localhost </code><code>test</code><code>]</code><code># find /test -name scrip2 -exec cat {} \;</code>

<code>#!/bin/bash</code>

<code>#</code>

<code>[ $</code><code># -lt 1 ] &amp;&amp; echo "please give one IP address" &amp;&amp; exit 1</code>

<code>[ $</code><code># -gt 1 ] &amp;&amp; echo "this script just match one IP address" &amp;&amp; exit 2</code>

<code>[ $</code><code># -eq 1 ] &amp;&amp; [[ $1 =~ (([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\.){3}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4]) ]] &amp;&amp; ping -c 1 $1 | sed -n '2p'|grep -o '^64' &gt;&gt; /dev/null &amp;&amp; echo "該IP位址可通路" || echo "該IP位址不可通路"</code>

<code>[root@localhost </code><code>test</code><code>]</code><code># find /test -name scrip2 | xargs cat</code>

2)将搜尋到的scrip2檔案的長格式資訊儲存在/test/scrip1中

<code>[root@localhost </code><code>test</code><code>]</code><code># find /test -name scrip2 -fls /test/scrip1</code>

<code>[root@localhost </code><code>test</code><code>]</code><code># cat scrip1</code>

locate與find的不同

locate由于非實時是以會查找到最近删除的檔案,而find則不會。上述的不同導緻查找的結果有所不同。

示例:在/test/檔案下有兩個檔案scrip1、scrip2,删除scrip1,然後在搜scrip1

<code>[root@localhost </code><code>test</code><code>]</code><code># stat /var/lib/mlocate/mlocate.db    </code>

<code>  </code><code>檔案:</code><code>"/var/lib/mlocate/mlocate.db"</code>

<code>  </code><code>大小:2771084         塊:5416       IO 塊:4096   普通檔案</code>

<code>裝置:fd00h</code><code>/64768d</code>      <code>Inode:35764072    硬連結:1</code>

<code>權限:(0640</code><code>/-rw-r-----</code><code>)  Uid:(    0/    root)   Gid:(   21/ slocate)</code>

<code>環境:system_u:object_r:locate_var_lib_t:s0</code>

<code>最近通路:2016-08-17 16:03:17.734189941 +0800</code>

<code>最近更改:2016-08-17 09:10:04.982775027 +0800</code>

<code>最近改動:2016-08-17 09:10:04.983775043 +0800</code>

<code>建立時間:-</code>

先檢視下該索引資料庫的最新改動時間,該時間是上午的,是以現在我們删除scrip1檔案後locate是可以搜到的。

<code>[root@localhost </code><code>test</code><code>]</code><code># ll</code>

<code>總用量 8</code>

<code>-rw-r--r--. 1 root root  82 8月  17 18:03 scrip1</code>

<code>-rwxr-xr-x. 1 root root 399 8月  16 20:44 scrip2</code>

<code>[root@localhost </code><code>test</code><code>]</code><code># rm scrip1</code>

<code>rm</code><code>:是否删除普通檔案 </code><code>"scrip1"</code><code>?y</code>

<code>總用量 4</code>

删除scrip1,然後搜尋它

<code>[root@localhost </code><code>test</code><code>]</code><code># locate scrip1 </code>

<code>/test/scrip1</code>

<code>[root@localhost </code><code>test</code><code>]</code><code># find /test/ -name scrip1</code>

比較結束。通過結果,如果我們要求搜尋結果靠譜最好還是使用find。

為了對find有更深的了解下面舉了關于find的8個例子

1、查找/var目錄下屬主為root,且屬組為mail的所有檔案

<code>[root@localhost ~]</code><code># find /var/ -user root -group mail -ls</code>

<code>67151194    4 drwxrwxr-x   2 root     mail         4096 8月 15 16:37 </code><code>/var/spool/mail</code>

<code>72699698    4 -rw-------   1 root     mail         2220 8月  2 19:41 </code><code>/var/spool/mail/root</code>

2、查找/var目錄下不屬于root、fedore、mail的所有檔案

<code>[root@localhost ~]</code><code># find /var/ -not -user root -a -not -user fedore -a -not -user mail -ls</code>

<code>69508348    0 drwxr-xr-x   2 unbound  unbound        21 7月 20 00:05 </code><code>/var/lib/unbound</code>

<code>69508349    4 -rw-r--r--   1 unbound  unbound       409 11月 20  2015 </code><code>/var/lib/unbound/root</code><code>.key</code>

<code>780655    0 drwx------   2 tss      tss             6 11月 21  2015 </code><code>/var/lib/tpm</code>

3、查找/var目錄下最近一周内其内容修改過,同時屬主不為root,也不是postfix的檔案

<code>[root@localhost ~]</code><code># find /var/ -mtime -7 -a -not -user root -a -not -user postfix -ls</code>

<code>101711459    0 drwxr-xr-x   3 colord   colord         50 7月 19 16:46 </code><code>/var/lib/colord</code>

4、查找目前系統上沒有屬主或屬組,且最近一個周内曾被通路過的檔案

<code>[root@localhost ~]</code><code># find / -nouser -a -atime -7 -ls</code>

<code>find</code><code>: ‘</code><code>/proc/2254/task/2254/fd/6</code><code>’: 沒有那個檔案或目錄</code>

<code>find</code><code>: ‘</code><code>/proc/2254/task/2254/fdinfo/6</code><code>’: 沒有那個檔案或目錄</code>

<code>find</code><code>: ‘</code><code>/proc/2254/fd/6</code><code>’: 沒有那個檔案或目錄</code>

<code>find</code><code>: ‘</code><code>/proc/2254/fdinfo/6</code><code>’: 沒有那個檔案或目錄</code>

5、查找/etc目錄下大于1M且類型為普通檔案的所有檔案

<code>[root@localhost ~]</code><code># find /etc -size +1M -a -type f -ls</code>

6、查找/etc目錄下所有使用者都沒有寫權限的檔案

<code>[root@localhost ~]</code><code># find /etc/ -not -perm /222 -ls  </code>

<code>190164  196 -r--r--r--   1 root     root       198453 7月 19 23:59 </code><code>/etc/pki/ca-trust/extracted/java/cacerts</code>

<code>33828600  352 -r--r--r--   1 root     root       359773 7月 19 23:59 </code><code>/etc/pki/ca-trust/extracted/openssl/ca-bundle</code><code>.trust.crt</code>

<code>67873473  264 -r--r--r--   1 root     root       266702 7月 19 23:59 </code><code>/etc/pki/ca-trust/extracted/pem/tls-ca-bundle</code><code>.pem</code>

7、查找/etc目錄下至少有一類使用者沒有執行權限的檔案

<code>[root@localhost ~]</code><code># find /etc/ -not -perm -222 -ls</code>

<code>35930065    4 -rw-r--r--   1 root     root          163 7月 19 23:54 </code><code>/etc/</code><code>.updated</code>

8、查找/etc/init.d目錄下,所有使用者都有執行權限,且其它使用者有寫權限的檔案

<code>[root@localhost ~]</code><code># find /etc/init.d/ -perm -113</code>

<code></code>

本文轉自 紫色的茶碗 51CTO部落格,原文連結:http://blog.51cto.com/chawan/1839664,如需轉載請自行聯系原作者