Linux文件查找,詳細的介紹了locate和find命令的使用 ...
在用linux操作系統的時候,當我們忘記之前某個文件存儲的位置,但是知道其文件名或者模糊的知道其文件名,我們都可以通過文件查找工具來查找,linux提供兩種常用的查找工具,locate和find,在日常使用中後者比前者較前者功能更強大更具有實時性,下麵我們就這兩種工具來談一談她們的使用方法。
Locate
locate是基於實現構建好的索引庫(索引庫可以理解成文件路徑的集合),索引庫的位置放在/var/lib/mlocate/mlocate.db文件裡面,系統一般一天會自動更新一次,也可以使用updatedb手動更新,要註意的是,索引庫的構建過程需要遍歷整個文件系統,非常消耗系統資源。
locate的特點是查找的速度快,比find快很多,因為它只在查找索引庫,而find會遍歷整個文件系統的路徑。快的好處自然也給locate帶來的缺點,就是它並非是實時查找,意思就是你如果剛剛創建了一個文件,但是你忘記了其路徑,只記得其名稱,那麼這個時候就不建議使用locate,因為索引資料庫沒有更新,你使用locate查不到,除非你走運,定期更新的時間剛好在創建文件完文件之後,locate在匹配文件名的時候是模糊匹配。
下麵我們就來介紹一下locate的用法:
locate
NAME:通過文件名查找文件 SYNOPSIS:locate [OPTION]... PATTERN... -b:只匹配路徑中的基名; -c:輸出符合條件文件的數目 -r:使用基本正則表達式 --regex:使用擴展正則表達式 -i:忽略大小寫 -q:安靜模式,不會有任何輸出
舉例1:查找含有"passwd"的文件名
[root@localhost ~]# locate passwd /etc/passwd /etc/passwd- /etc/pam.d/passwd /etc/security/opasswd /usr/bin/gpasswd /usr/bin/grub2-mkpasswd-pbkdf2 ......(省略) /usr/share/doc/passwd-0.79/AUTHORS /usr/share/doc/passwd-0.79/COPYING /usr/share/doc/passwd-0.79/ChangeLog /usr/share/doc/passwd-0.79/NEWS /usr/share/vim/vim74/ftplugin/passwd.vim /usr/share/vim/vim74/syntax/passwd.vim
我們會發現,非基名中存在passwd也會被匹配出來,我們可以使用"-b"選項來匹配:
[root@localhost ~]# locate -b passwd /etc/passwd /etc/passwd- /etc/pam.d/passwd /etc/security/opasswd /usr/bin/gpasswd /usr/bin/grub2-mkpasswd-pbkdf2 /usr/bin/kdepasswd /usr/bin/kpasswd /usr/bin/lppasswd /usr/bin/passwd /usr/bin/vncpasswd ...... /usr/share/man/zh_CN/man8/chpasswd.8.gz /usr/share/man/zh_CN/man8/smbpasswd.8.gz /usr/share/man/zh_TW/man8/chpasswd.8.gz /usr/share/ruby/webrick/httpauth/htpasswd.rb /usr/share/vim/vim74/ftplugin/passwd.vim /usr/share/vim/vim74/syntax/passwd.vim看輸出的顯示結果,只有基名中含有"passwd"的才會被匹配 舉例2:查找只有基名中含有"passwd"的文件名的數目
[root@localhost ~]# locate -bc passwd 155
舉例3:查找基名中只有"passwd"文件的文件
[root@localhost ~]# locate -br "\<passwd$" /etc/passwd /etc/pam.d/passwd /usr/bin/passwd /usr/share/bash-completion/completions/passwd
updatedb的配置文件在/etc/updatedb.conf
PRUNE_BIND_MOUNTS = "yes" PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fuse.sshfs fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs" PRUNENAMES = ".git .hg .svn" PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/spool/cups /var/spool/squid /var/tmp"
PRUNE_BIND_MOUNTS:表示是否限制搜索
PRUNEFS:所列的文件系統,查找的時候不進行查找
PRUNENAMES:所列的尾碼名不進行查找
PRUNEPATHS:所列的文件路徑下的文件不進行查找
實時性檢測
[root@localhost etc]# touch mypasswd [root@localhost etc]# [root@localhost etc]# locate mypasswd [root@localhost etc]# [root@localhost etc]# updatedb [root@localhost etc]# [root@localhost etc]# locate mypasswd /etc/mypasswd
在etc下我們創建mypasswd,立馬使用locate命令查找並不能查找,使用updatedb之後更新之後索引資料庫之後就可以查找到了。
find
通過直面意思我們就知道find就是“查找”的意思,find的是一個實時查找命令,它會在查找的時候會遍歷指定起始路徑下文件系統層級結構完成文件查找,所以其缺點就是查找的速度要比locate慢。
下麵我們就要介紹一下find的使用方法:
NAME:遞歸地在層次目錄中處理文件 SYNOPSIS:find [OPTIONS] [查找起始路徑] [查找條件] [處理動作] 查找路徑:可以指定搜索目標的其實路徑,預設為當前目錄 查找條件:可以指定查找標準,可以根據文件名、大小、類型、從屬關係、許可權等匹配 處理動作:對符合查找條件的文件做出操作,比如刪除等,預設行為為至標準輸出
find的選項不常用,瞭解可使用man find來查看,下麵主要來說明一下查找條件和處理動作,find的狀態返回值為布爾值,查找的到則返回"0",查找不到則返回大於"0"的數字。
查找條件:
1.根據文件名查找
-name "pattern" -iname "pattern" #支持的通配符的模式,i為不區分大小寫 -regex "pattern" #基於正則表達式模式查找文件,註意這裡匹配的不是文件本身,而是包含這個文件路徑
舉例:
[root@localhost etc]# find /etc/ -name "passwd" #搜索/etc目錄下含有passwd的文件 /etc/pam.d/passwd /etc/passwd [root@localhost etc]# find /etc/ -iname "passwd" #搜索/etc目錄下含有passwd的文件,忽略字元大小寫 /etc/pam.d/passwd /etc/passwd /etc/Passwd [root@localhost etc]# find /etc/ -iname "passwd[0-9]" #搜索/etc目錄下含有passwd且後面還有0-9任意一個數字的文件 /etc/passwd1 [root@localhost etc]# find /etc/ -regex '/etc/passwd.?' #搜索/etc目錄下含基名以passwd開頭且後面可以有任意字元也可以沒有的文件 /etc/passwd /etc/passwd- /etc/passwd1
2.根據文件從屬關係查找
-user USERNAME:查找屬主為指定用戶的文件 -group GROUPNAME:查找屬組為指定組的文件 -uid UID:查找屬主為指定UID的文件 -gid GID:查找屬組為指定的GID的文件 -nouser:查找沒有屬主的文件 -nogroup:查找沒有屬組的文件
舉例:
[root@localhost ~]# find /tmp/ -user frank -ls #輸出tmp下屬主是frank的文件,-ls後面再講 9336543 0 drwx------ 2 frank frank 27 7月 16 04:46 /tmp/kde-frank 9357728 4 -rw-rw-r-- 1 frank frank 132 7月 16 04:46 /tmp/kde-frank/xauth-1000-_0 9357736 0 drwx------ 2 frank frank 34 7月 16 04:47 /tmp/akonadi-frank.yFqCJF 9357758 0 srwxrwxr-x 1 frank frank 0 7月 16 04:46 /tmp/akonadi-frank.yFqCJF/akonadiserver.socket 27750615 0 drwx------ 2 frank frank 6 7月 16 04:47 /tmp/.esd-1000 [root@localhost ~]# find /tmp/ -group frank -ls #輸出/tmp目錄下屬組是frank的文件 9336543 0 drwx------ 2 frank frank 27 7月 16 04:46 /tmp/kde-frank 9357728 4 -rw-rw-r-- 1 frank frank 132 7月 16 04:46 /tmp/kde-frank/xauth-1000-_0 9357736 0 drwx------ 2 frank frank 34 7月 16 04:47 /tmp/akonadi-frank.yFqCJF 9357758 0 srwxrwxr-x 1 frank frank 0 7月 16 04:46 /tmp/akonadi-frank.yFqCJF/akonadiserver.socket 27750615 0 drwx------ 2 frank frank 6 7月 16 04:47 /tmp/.esd-1000 [root@localhost ~]# find /tmp/ -uid 1000 #顯示/tmp下uid為1000的文件 /tmp/kde-frank /tmp/kde-frank/xauth-1000-_0 /tmp/akonadi-frank.yFqCJF /tmp/akonadi-frank.yFqCJF/akonadiserver.socket /tmp/.esd-1000 [root@localhost ~]# find /tmp/ -nouser -ls #顯示/tmp下沒有屬主的文件,如果一個用戶創建一個文件之後,用戶被刪除,則顯示為原來的uid和gid,不會顯示屬組合屬主 375722 0 -rw-rw-r-- 1 1003 1003 0 7月 23 00:08 /tmp/mygrp.txt
3.根據文件類型查找
-type TYPE
TYPE可以為以下:
f:普通文件
d:目錄文件
l:符號鏈接
b:塊設備文件
c:字元設備文件
p:管道文件
s:套接字文件
舉例:
[root@localhost ~]# find /dev/ -type b #查找dev目錄下的塊設備文件 /dev/dm-2 /dev/dm-1 /dev/dm-0 /dev/sr0 /dev/sda2 /dev/sda1 /dev/sda
4.根據文件大小查找
一般格式為 -size [+|-]#UNIT UNIT常用單位為:k,M,G
-size #UNIT:匹配的大小範圍是#及大於#-1的文件
舉例:匹配3K的大小,大於2K及小於等於3K的都會被匹配
[root@localhost ~]# ll -h 總用量 16K -rw-------. 1 root root 2.1K 7月 16 04:45 anaconda-ks.cfg -rw-r--r--. 1 root root 2.1K 7月 16 04:45 initial-setup-ks.cfg -rw-r--r--. 1 root root 555 7月 19 10:04 TEST -rw-------. 1 root root 3.0K 7月 23 00:23 test.txt [root@localhost ~]# find -size 3k -ls 27734414 4 -rw------- 1 root root 2094 7月 16 04:45 ./anaconda-ks.cfg 27734452 4 -rw-r--r-- 1 root root 2142 7月 16 04:45 ./initial-setup-ks.cfg 25795843 4 -rw------- 1 root root 3070 7月 23 00:23 ./test.txt
-size -#UNIT:匹配的範圍是文件大小大於0且小於等於#-1的文件
舉例:
[root@localhost ~]# find -size -3k -ls 25165889 0 dr-xr-x--- 6 root root 261 7月 23 00:23 . 27728080 4 -rw-r--r-- 1 root root 18 12月 29 2013 ./.bash_logout 27728081 4 -rw-r--r-- 1 root root 176 12月 29 2013 ./.bash_profile 27728082 4 -rw-r--r-- 1 root root 176 12月 29 2013 ./.bashrc 27728083 4 -rw-r--r-- 1 root root 100 12月 29 2013 ./.cshrc 27728084 4 -rw-r--r-- 1 root root 129 12月 29 2013 ./.tcshrc 1327848 0 drwx------ 3 root root 25 7月 16 04:45 ./.dbus 9336529 0 drwx------ 2 root root 48 7月 16 04:45 ./.dbus/session-bus 9336530 4 -rw-r--r-- 1 root root 462 7月 16 04:45 ./.dbus/session-bus/6155eeadc72c4d45b9ead1cf2a8c65a0-9 ....(省略)
-size +#UNIT:匹配的是大於#的文件
[root@localhost ~]# ll -ah 總用量 52K dr-xr-x---. 6 root root 261 7月 23 00:23 . dr-xr-xr-x. 17 root root 233 7月 16 04:44 .. -rw-------. 1 root root 2.1K 7月 16 04:45 anaconda-ks.cfg -rw-------. 1 root root 4.8K 7月 19 10:14 .bash_history -rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout -rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile -rw-r--r--. 1 root root 176 12月 29 2013 .bashrc drwx------. 4 root root 31 7月 16 04:46 .cache drwxr-xr-x. 3 root root 40 7月 16 04:46 .config -rw-r--r--. 1 root root 100 12月 29 2013 .cshrc drwx------. 3 root root 25 7月 16 04:45 .dbus -rw-r--r--. 1 root root 2.1K 7月 16 04:45 initial-setup-ks.cfg drwxr-xr-x. 3 root root 123 7月 16 04:45 .kde -rw-r--r--. 1 root root 129 12月 29 2013 .tcshrc -rw-r--r--. 1 root root 555 7月 19 10:04 TEST -rw-------. 1 root root 3.0K 7月 23 00:23 test.txt -rw-------. 1 root root 6.4K 7月 23 00:23 .viminfo [root@localhost ~]# find -size +3k #匹配大於3k的文件 ./.config/Trolltech.conf ./.bash_history ./.viminfo
5.根據時間戳查找
可根據天或者分鐘查找
根據天: -atime n:對文件的最近一次訪問是在 n*24 小時之前 -mtime n:對文件數據的最近一次修改是在 n*24 小時之前 -ctime n:對文件狀態的最近一次修改是在 n*24 小時之前,當元數據修改時 根據分鐘: -amin n:對文件的最近一次訪問是在n分鐘之前 -mmin n:對文件數據的最近一次修改是在n分鐘之前 -cmin n:對文件狀態的最近一次修改是在n分鐘之前,當元數據修改時
同時也支持 "-atime [+|-]#"
情景1:find -atime 1 :如下圖,如果現在時間是0:56分,那麼查找1天前訪問過的文件為哪些,查找的就是2017-7-21-0:56(不包含)到2017-7-21-00:56(包含)分訪問的文件,
情景2:find -atime -1:使用"-",查找的是1天之內,如下圖,如果現在是0:56,則不包括2017-7-22-0:56
情景3:find -atime +1:使用符號"+",表示的是查找1+1之前訪問過的文件,如果現在0:56,則2017-7-21-00:56(包括00:56)之前訪問過的文件才會被匹配
其他的ctime、mtime和分鐘的查找類似,這裡就不再敖述了。測試可以使用touch命令修改時間戳的方式來嘗試
touch -t 201707210130 mytime.txt
6.根據許可權查找
格式:-perm [/|-]mode mode:精確匹配許可權 /mode:任何一類用戶(u,g,o)的許可權中的任何一位(r,w,x)符合條件即滿足,9位許可權之間存在“或”關係 -mode:每一類用戶(u,g,o)的許可權每一位同時符合條件即滿足;9位許可權之間存在“與”關係
舉例1:精確匹配/tmp/myper目錄下許可權是411的文件
[root@localhost ~]# find /tmp/myper/ -perm 422 -ls 654578 0 -r---w--w- 1 root root 0 7月 23 07:32 /tmp/myper/myper2
舉例2:匹配/tmp/myper其他用戶有執行許可權的文件
[root@localhost ~]# find /tmp/myper/ -perm /001 -ls 18772160 0 drwxr-xr-x 2 root root 62 7月 23 07:38 /tmp/myper/ 654577 0 -rw---x--x 1 root root 0 7月 23 07:32 /tmp/myper/myper1 654579 0 ---xr-xr-x 1 root root 0 7月 23 07:32 /tmp/myper/myper3 654580 0 -rwxr-xr-x 1 root root 0 7月 23 07:32 /tmp/myper/myper4
舉例3:匹配/tmp/myper下user許可權至少可讀,group和others許可權至少可以執行的文件
[root@localhost ~]# find /tmp/myper/ -perm -411 -ls 18772160 0 drwxr-xr-x 2 root root 62 7月 23 07:38 /tmp/myper/ 654577 0 -rw---x--x 1 root root 0 7月 23 07:32 /tmp/myper/myper1 654580 0 -rwxr-xr-x 1 root root 0 7月 23 07:32 /tmp/myper/myper4
處理動作:
-print:輸出至標準輸出,預設選項 -ls:類似對查到的文件執行"ls -l"命令 -delete:刪除查到的文件 -fls /PATE/TO/SOMEFILE:把查到的所有文件的長格式信息保存至指定的文件 -ok COMMAND {} \; :對查到的每個文件執行由COMMAND表示的命令,每次操作都由用戶確認 -exec COMMAND {} \; :對查到的每個文件執行由COMMAND表示的命令,無需用戶確認
find傳遞查到的文件路徑至後面的命令時,是先查找所有符合條件的路徑,並一次性傳遞給後面的命令的,但是有些命令不能接受過長的參數,此時命令會執行失敗,可以使用以下方法:
find | xargs COMMAND
xargs可以讀取標準輸出的內容,並以空白字元或者斷行字元作為分隔符,分隔為arguments,然後一一傳遞給COMMAND執行
舉例:查看符合條件文件的文件元數據
[root@localhost ~]# find /tmp/myper/ -perm -411 | stat stat: 缺少操作數 Try 'stat --help' for more information. [root@localhost ~]# find /tmp/myper/ -perm -411 | xargs stat 文件:"/tmp/myper/" 大小:62 塊:0 IO 塊:4096 目錄 設備:fd00h/64768d Inode:18772160 硬鏈接:2 許可權:(0755/drwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root) 環境:unconfined_u:object_r:user_tmp_t:s0 最近訪問:2017-07-23 07:38:40.570675351 +0800 最近更改:2017-07-23 07:38:33.192894947 +0800 最近改動:2017-07-23 07:38:33.192894947 +0800 創建時間:- 文件:"/tmp/myper/myper1" 大小:7 塊:8 IO 塊:4096 普通文件 設備:fd00h/64768d Inode:654577 硬鏈接:1 許可權:(0611/-rw---x--x) Uid:( 0/ root) Gid:( 0/ root) 環境:unconfined_u:object_r:user_tmp_t:s0 最近訪問:2017-07-23 07:58:31.699745976 +0800 最近更改:2017-07-23 07:57:38.304747287 +0800 最近改動:2017-07-23 07:57:38.304747287 +0800 創建時間:- 文件:"/tmp/myper/myper4" 大小:7 塊:8 IO 塊:4096 普通文件 設備:fd00h/64768d Inode:654580 硬鏈接:1 許可權:(0755/-rwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root) 環境:unconfined_u:object_r:user_tmp_t:s0 最近訪問:2017-07-23 07:58:31.699745976 +0800 最近更改:2017-07-23 07:57:53.229457221 +0800 最近改動:2017-07-23 07:57:53.229457221 +0800 創建時間:-
擴展小特性:
在查找的時候多個條件之間的關係: 與:-a ,預設的關係 或:-o ,滿足一個條件即可 非:-not或者! ,條件取反 有以下表達式: !A -a !B = !(A -o B) !A -o !B = !(A -a B)小練習: 練習1:找出/tmp目錄下屬主為非root的所有文件
find /tmp/ -not -user root -lsView Code
練習2:找出/tmp目錄下文件名中不包含fstab字元串的文件
find /tmp/ -not -name fstab
View Code
練習3:找出/tmp目錄下屬主為非root,而且文件名不包含fstab字元串的文件
find /tmp/ ! \( -user root -o -name fstab \)
View Code
練習4:查找/var目錄下屬主為root,且屬組為mail的所有文件或目錄
find /var/ -user root -a -group mail -lsView Code
練習5:查找/usr目錄下不屬於用戶root, bin或hadoop的所有文件或目錄;用兩種方法
find /usr/ -not -user root -a -not -user bin -a -not -user hadoop find /usr/ -not \( -user root -o -user bin -o -user hadoop \)View Code
練習6:查找/etc目錄下最近一周內其內容修改過,且屬主不是root用戶也不是hadoop用戶的文件或目錄
find /etc/ -mtime 7 -a -not -user root -a -not -user hadoopView Code
練習7:查找當前系統上沒有屬或屬組,且最近一周內曾被訪問過的文件或目錄
find / \( -nouser -o -nogroup \) -atime -7View Code
練習8:查找/etc目錄下大於1M且類型為普通文件的所有文件
find /etc/ -size +1M -type f -exec ls -lh {} \;View Code
練習9:查找/etc目錄下所有用戶都沒有寫許可權的文件
find /etc/ -not -perm /222View Code
練習10:查找/etc目錄至少有一類用戶沒有執行許可權的文件
find /etc/ -not -perm -111View Code
練習11:查找/etc/init.d/目錄下,所有用戶都有執行許可權,且其它用戶有寫許可權的所有文件
find /etc/init.d/ -perm -113View Code