《LINUX實操:Linux文件查找命令(locate/find)》要點:
本文介紹了LINUX實操:Linux文件查找命令(locate/find),希望對您有用。如果有疑問,可以聯系我們。
在用linux操作系統的時候,當我們忘記之前某個文件存儲的位置,但是知道其文件名或者模糊的知道其文件名,我們都可以通過文件查找工具來查找,linux提供兩種常用的查找工具,locate和find,在日常使用中后者比前者較前者功能更強大更具有實時性,下面我們就這兩種工具來談一談她們的使用辦法.
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
[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的是一個實時查找命令,它會在查找的時候會遍歷指定起始路徑下文件系統層級結構完成文件查找,所以其缺點便是查找的速度要比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 創建時間:-?
?擴展小特性:
find /tmp/ -not -user root -ls
?練習2:找出/tmp目錄下文件名中不包括fstab字符串的文件
find /tmp/ -not -name fstab
?練習3:找出/tmp目錄下屬主為非root,而且文件名不包括fstab字符串的文件
find /tmp/ ! \( -user root -o -name fstab \)
?練習4:查找/var目錄部屬主為root,且屬組為mail的所有文件或目錄
find /var/ -user root -a -group mail -ls
?練習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 \)
?練習6:查找/etc目錄下最近一周內其內容改動過,且屬主不是root用戶也不是hadoop用戶的文件或目錄
find /etc/ -mtime 7 -a -not -user root -a -not -user hadoop
?練習7:查找當前系統上沒有屬或屬組,且最近一周內曾被拜訪過的文件或目錄
find / \( -nouser -o -nogroup \) -atime -7
?練習8:查找/etc目錄下年夜于1M且類型為普通文件的所有文件
find /etc/ -size +1M -type f -exec ls -lh {} \;
?演習9:查找/etc目錄下所有用戶都沒有寫權限的文件
find /etc/ -not -perm /222
?演習10:查找/etc目錄至少有一類用戶沒有執行權限的文件
find /etc/ -not -perm -111
?演習11:查找/etc/init.d/目錄下,所有用戶都有執行權限,且其它用戶有寫權限的所有文件
find /etc/init.d/ -perm -113
本文永遠更新鏈接地址:
學習更多LINUX教程,請查看站內專欄,如果有LINUX疑問,可以加QQ交流《LINUX實操:Linux文件查找命令(locate/find)》。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/9323.html