2021-05-12 14:32:11
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
|
[root@localhost etc] # locate -c file 2540 [root@localhost etc] # locate -b pwd /etc/ . pwd .lock /usr/bin/pwd /usr/bin/pwdx /usr/lib/modules/3 .10.0-327.el7.x86_64 /kernel/drivers/watchdog/hpwdt .ko /usr/lib64/cracklib_dict . pwd /usr/sbin/unix_chkpwd /usr/share/cracklib/cracklib-small . pwd /usr/share/cracklib/pw_dict . pwd /usr/share/man/man0p/pwd .h.0p.gz /usr/share/man/man1/pwd .1.gz /usr/share/man/man1/pwdx .1.gz /usr/share/man/man1p/pwd .1p.gz /usr/share/man/man3/lckpwdf .3.gz /usr/share/man/man3/ulckpwdf .3.gz /usr/share/man/man8/unix_chkpwd .8.gz /usr/share/man/overrides/de/man1/pwdx .1 /usr/share/man/overrides/fr/man1/pwdx .1 /usr/share/man/overrides/uk/man1/pwdx .1 [root@localhost test ] # locate -r '.*scrip2$' /test/scrip2 [root@localhost test ] # |
上面演示了locate的三種選項的簡單用法
find
find屬於實時查詢工具,通過遍歷指定起始路徑下檔案系統層級結構完成檔案查詢。
它的工作特性:查詢速度略慢、精確查詢、實時查詢。
find [OPTION]... [查詢路徑] [查詢條件] [處理動作]
查詢路徑:指定具體目標路徑;預設為當前目錄
查詢條件:指定的查詢標準,可以檔名、大小、型別、許可權等標準進行;預設為找出指定路徑下的所有檔案
處理動作:對符合條件的檔案做操作,預設輸出至螢幕
………………………………………………………………………………………………………………………
查詢條件:
表示式:選項和測試(常為布林型)
………………………………………………………………………………………………………………………
根據檔名和inode查詢:
-name "檔名稱":支援使用glob
*, ?, [], [^]
-iname"檔名稱":不區分字母大小寫
-inumn 按inode號查詢
-regex "PATTERN":基於正規表示式模式查詢檔案,匹配的是整個路徑而非其名
範例:查詢包含有字串“what”的檔案
1
2
3
4
5
|
[root@localhost test ] # find / -name *what* -ls 72662849 4 drwxr-xr-x 2 root root 4096 7月 20 00:36 /var/lib/yum/yumdb/v/9879449b2e44ada0445cf495a38c3fd10c942c54-virt-what-1 .13-6.el7-x86_64 2536807 4 -rw-r--r-- 1 root root 2836 6月 10 2014 /var/cache/man/cat1/whatis .1.gz 35799386 48 -rwxr-xr-x 1 root root 46456 6月 10 2014 /usr/bin/whatis ... |
………………………………………………………………………………………………………………………
根據屬主、屬組查詢:
-user USERNAME:查詢屬主為指定使用者(UID)的檔案
-group GRPNAME: 查詢屬組為指定組(GID)的檔案
-uidUserID:查詢屬主為指定的UID號的檔案
-gidGroupID:查詢屬組為指定的GID號的檔案
-nouser:查詢沒有屬主的檔案
-nogroup:查詢沒有屬組的檔案
範例:檢視/下屬於使用者fedore的檔案,或沒有屬主的檔案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
[root@localhost test ] # find / -user fedore -ls find : ‘ /proc/10542/task/10542/fd/6 ’: 沒有那個檔案或目錄 find : ‘ /proc/10542/task/10542/fdinfo/6 ’: 沒有那個檔案或目錄 find : ‘ /proc/10542/fd/6 ’: 沒有那個檔案或目錄 find : ‘ /proc/10542/fdinfo/6 ’: 沒有那個檔案或目錄 74331703 0 -rw-rw---- 1 fedore mail 0 8月 2 21:49 /var/spool/mail/fedore 1477708 4 drwx------ 3 fedore fedore 4096 8月 15 17:11 /home/fedore 35996645 0 drwxr-xr-x 4 fedore fedore 37 7月 19 23:54 /home/fedore/ .mozilla 73207822 0 drwxr-xr-x 2 fedore fedore 6 6月 10 2014 /home/fedore/ .mozilla /extensions 101849766 0 drwxr-xr-x 2 fedore fedore 6 6月 10 2014 /home/fedore/ .mozilla /plugins 1477714 4 -rw-r--r-- 1 fedore fedore 18 11月 20 2015 /home/fedore/ .bash_logout 1477721 4 -rw------- 1 fedore fedore 152 8月 15 17:11 /home/fedore/ . history 2538688 4 -rw-r--r-- 1 fedore fedore 237 8月 15 16:45 /home/fedore/ .bash_profile 2538686 4 -rw-r--r-- 1 fedore fedore 273 8月 15 16:49 /home/fedore/ .bashrc 2356350 4 -rw------- 1 fedore fedore 134 8月 15 17:01 /home/fedore/ .Xauthority [root@localhost test ] # find / -nouser -ls find : ‘ /proc/10540/task/10540/fd/6 ’: 沒有那個檔案或目錄 find : ‘ /proc/10540/task/10540/fdinfo/6 ’: 沒有那個檔案或目錄 find : ‘ /proc/10540/fd/6 ’: 沒有那個檔案或目錄 find : ‘ /proc/10540/fdinfo/6 ’: 沒有那個檔案或目錄 101603081 0 -rw-r--r-- 1 4001 root 0 8月 14 14:47 /tmp/3fstab2 |
………………………………………………………………………………………………………………………
根據檔案型別查詢:
-type TYPE:
f: 普通檔案
d: 目錄檔案
l: 符號連結檔案
s:通訊端檔案
b: 塊裝置檔案
c: 字元裝置檔案
p: 管道檔案
範例:查詢/test下的普通檔案
1
2
|
[root@localhost test ] # find /test/ -type f -ls 1832646 4 -rwxr-xr-x 1 root root 399 8月 16 20:44 /test/scrip2 |
………………………………………………………………………………………………………………………
組合條件:
與:-a
或:-o
非:-not, !
範例:查詢/tmp下屬於root且檔案型別為普通檔案的檔案
1
2
3
4
|
[root@localhost test ] # find /tmp/ -user root -a -type f -ls 74330358 4 -rw-r----- 1 root root 3092 8月 12 21:31 /tmp/vmware-root/vmware-apploader-6127 .log 74330359 4 -rw-r----- 1 root root 3092 8月 12 21:31 /tmp/vmware-root/vmware-apploader-6135 .log ... |
………………………………………………………………………………………………………………………
根據檔案大小來查詢:
-size [+|-]#UNIT
常用單位:k, M, G
#UNIT: (#-1, #]
如:6k 表示(5k,6k]
-#UNIT:[0,#-1]
如:-6k 表示[0,5k]
+#UNIT:(#,∞)
如:+6k 表示(6k,∞)
範例:查詢/etc下大於1M的檔案
1
2
3
4
5
|
[root@localhost test ] # find /etc -size +1M -ls 102807508 1304 -rw------- 1 root root 1333123 8月 2 10:09 /etc/selinux/targeted/contexts/files/file_contexts .bin 36013992 3688 -rw-r--r-- 1 root root 3773309 8月 2 10:09 /etc/selinux/targeted/policy/policy .29 72664102 6852 -r--r--r-- 1 root root 7014922 7月 20 00:38 /etc/udev/hwdb .bin 34828897 1336 -rw-r--r-- 1 root root 1367395 3月 6 2015 /etc/brltty/zh-tw .ctb |
………………………………………………………………………………………………………………………
根據時間戳:
以“天”為單位;
-atime[+|-]#,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
以“分鐘”為單位:
-amin
-mmin
-cmin
範例:查詢/etc資料夾下2天內被存取過的檔案
1
2
3
4
5
|
[root@localhost test ] # find /etc -atime -2 -ls 36017835 4 -rw-r--r-- 1 root root 19 7月 20 00:36 /etc/locale .conf 36017836 4 -rw-r--r-- 1 root root 22 7月 20 00:36 /etc/hostname 33554565 4 -rw-r--r-- 1 root root 1309 8月 17 08:03 /etc/tpvmlp .conf ... |
………………………………………………………………………………………………………………………
根據許可權查詢:
-perm [/|-]MODE
MODE: 精確許可權匹配
/MODE:任何一類(u,g,o)物件的許可權中只要能一位匹配即可,或關係,
“-perm +mode”從CentOS7後被“-perm /mode”格式替代
-MODE:每一類物件都必須同時擁有指定許可權,與關係
範例:查詢/tmp下至少有一類物件有寫許可權的檔案
1
2
3
4
5
6
7
8
9
|
[root@localhost ~] # find /tmp -perm /222 -ls 100663425 4 drwxrwxrwt 15 root root 4096 8月 17 17:36 /tmp 34305371 0 drwxrwxrwt 2 root root 6 7月 20 00:04 /tmp/ .Test-unix 69465462 0 drwxrwxrwt 2 root root 15 8月 17 08:02 /tmp/ .X11-unix 74098510 0 srwxrwxrwx 1 root root 0 8月 17 08:02 /tmp/ .X11-unix /X0 101599413 0 drwxrwxrwt 2 root root 6 7月 20 00:04 /tmp/ .XIM-unix 760765 0 drwxrwxrwt 2 root root 6 7月 20 00:04 /tmp/ .font-unix 34305372 4 drwxrwxrwt 2 root root 4096 8月 17 08:03 /tmp/ .ICE-unix ... |
………………………………………………………………………………………………………………………
處理動作:
-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中
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@localhost test ] # find /test -name scrip2 -exec cat {} ; #!/bin/bash # [ $ # -lt 1 ] && echo "please give one IP address" && exit 1 [ $ # -gt 1 ] && echo "this script just match one IP address" && exit 2 [ $ # -eq 1 ] && [[ $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]) ]] && ping -c 1 $1 | sed -n '2p'|grep -o '^64' >> /dev/null && echo "該IP地址可存取" || echo "該IP地址不可存取" [root@localhost test ] # find /test -name scrip2 | xargs cat #!/bin/bash # [ $ # -lt 1 ] && echo "please give one IP address" && exit 1 [ $ # -gt 1 ] && echo "this script just match one IP address" && exit 2 [ $ # -eq 1 ] && [[ $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]) ]] && ping -c 1 $1 | sed -n '2p'|grep -o '^64' >> /dev/null && echo "該IP地址可存取" || echo "該IP地址不可存取" |
2)將搜尋到的scrip2檔案的長格式資訊儲存在/test/scrip1中
1
2
3
|
[root@localhost test ] # find /test -name scrip2 -fls /test/scrip1 [root@localhost test ] # cat scrip1 1832646 4 -rwxr-xr-x 1 root root 399 8月 16 20:44 /test/scrip2 |
locate與find的不同
locate由於非實時因此會查詢到最近刪除的檔案,而find則不會。上述的不同導致查詢的結果有所不同。
範例:在/test/檔案下有兩個檔案scrip1、scrip2,刪除scrip1,然後在搜scrip1
1
2
3
4
5
6
7
8
9
10
|
[root@localhost test ] # stat /var/lib/mlocate/mlocate.db 檔案: "/var/lib/mlocate/mlocate.db" 大小:2771084 塊:5416 IO 塊:4096 普通檔案 裝置:fd00h /64768d Inode:35764072 硬連結:1 許可權:(0640 /-rw-r----- ) Uid:( 0/ root) Gid:( 21/ slocate) 環境:system_u:object_r:locate_var_lib_t:s0 最近存取:2016-08-17 16:03:17.734189941 +0800 最近更改:2016-08-17 09:10:04.982775027 +0800 最近改動:2016-08-17 09:10:04.983775043 +0800 建立時間:- |
先檢視下該索引資料庫的最新改動時間,該時間是上午的,所以現在我們刪除scrip1檔案後locate是可以搜到的。
1
2
3
4
5
6
7
8
9
|
[root@localhost test ] # ll 總用量 8 -rw-r--r--. 1 root root 82 8月 17 18:03 scrip1 -rwxr-xr-x. 1 root root 399 8月 16 20:44 scrip2 [root@localhost test ] # rm scrip1 rm :是否刪除普通檔案 "scrip1" ?y [root@localhost test ] # ll 總用量 4 -rwxr-xr-x. 1 root root 399 8月 16 20:44 scrip2 |
刪除scrip1,然後搜尋它
1
2
3
4
|
[root@localhost test ] # locate scrip1 /test/scrip1 [root@localhost test ] # find /test/ -name scrip1 [root@localhost test ] # |
比較結束。通過結果,如果我們要求搜尋結果靠譜最好還是使用find。
為了對find有更深的了解下面舉了關於find的8個例子
1、查詢/var目錄下屬主為root,且屬組為mail的所有檔案
1
2
3
|
[root@localhost ~] # find /var/ -user root -group mail -ls 67151194 4 drwxrwxr-x 2 root mail 4096 8月 15 16:37 /var/spool/mail 72699698 4 -rw------- 1 root mail 2220 8月 2 19:41 /var/spool/mail/root |
2、查詢/var目錄下不屬於root、fedore、mail的所有檔案
1
2
3
4
5
|
[root@localhost ~] # find /var/ -not -user root -a -not -user fedore -a -not -user mail -ls 69508348 0 drwxr-xr-x 2 unbound unbound 21 7月 20 00:05 /var/lib/unbound 69508349 4 -rw-r--r-- 1 unbound unbound 409 11月 20 2015 /var/lib/unbound/root .key 780655 0 drwx------ 2 tss tss 6 11月 21 2015 /var/lib/tpm ... |
3、查詢/var目錄下最近一週內其內容修改過,同時屬主不為root,也不是postfix的檔案
1
2
3
4
|
[root@localhost ~] # find /var/ -mtime -7 -a -not -user root -a -not -user postfix -ls 69508348 0 drwxr-xr-x 2 unbound unbound 21 7月 20 00:05 /var/lib/unbound 780655 0 drwx------ 2 tss tss 6 11月 21 2015 /var/lib/tpm 101711459 0 drwxr-xr-x 3 colord colord 50 7月 19 16:46 /var/lib/colord |
4、查詢當前系統上沒有屬主或屬組,且最近一個週內曾被存取過的檔案
1
2
3
4
5
6
|
[root@localhost ~] # find / -nouser -a -atime -7 -ls find : ‘ /proc/2254/task/2254/fd/6 ’: 沒有那個檔案或目錄 find : ‘ /proc/2254/task/2254/fdinfo/6 ’: 沒有那個檔案或目錄 find : ‘ /proc/2254/fd/6 ’: 沒有那個檔案或目錄 find : ‘ /proc/2254/fdinfo/6 ’: 沒有那個檔案或目錄 101603081 0 -rw-r--r-- 1 4001 root 0 8月 14 14:47 /tmp/3fstab2 |
5、查詢/etc目錄下大於1M且型別為普通檔案的所有檔案
1
2
3
4
5
|
[root@localhost ~] # find /etc -size +1M -a -type f -ls 102807508 1304 -rw------- 1 root root 1333123 8月 2 10:09 /etc/selinux/targeted/contexts/files/file_contexts .bin 36013992 3688 -rw-r--r-- 1 root root 3773309 8月 2 10:09 /etc/selinux/targeted/policy/policy .29 72664102 6852 -r--r--r-- 1 root root 7014922 7月 20 00:38 /etc/udev/hwdb .bin 34828897 1336 -rw-r--r-- 1 root root 1367395 3月 6 2015 /etc/brltty/zh-tw .ctb |
6、查詢/etc目錄下所有使用者都沒有寫許可權的檔案
1
2
3
4
5
|
[root@localhost ~] # find /etc/ -not -perm /222 -ls 190164 196 -r--r--r-- 1 root root 198453 7月 19 23:59 /etc/pki/ca-trust/extracted/Java/cacerts 33828600 352 -r--r--r-- 1 root root 359773 7月 19 23:59 /etc/pki/ca-trust/extracted/openssl/ca-bundle .trust.crt 67873473 264 -r--r--r-- 1 root root 266702 7月 19 23:59 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle .pem ... |
7、查詢/etc目錄下至少有一類使用者沒有執行許可權的檔案
1
2
3
4
5
|
[root@localhost ~] # find /etc/ -not -perm -222 -ls 36017835 4 -rw-r--r-- 1 root root 19 7月 20 00:36 /etc/locale .conf 36017836 4 -rw-r--r-- 1 root root 22 7月 20 00:36 /etc/hostname 35930065 4 -rw-r--r-- 1 root root 163 7月 19 23:54 /etc/ .updated ... |
8、查詢/etc/init.d目錄下,所有使用者都有執行許可權,且其它使用者有寫許可權的檔案
1
|
[root@localhost ~] # find /etc/init.d/ -perm -113 |
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/134662.htm
相關文章