Linux中在文件系統上查找符合條件的文件,實現工具有locate和find
locate:
1.它是依賴于事先索引構建好的數據庫進行查找的。更新它的數據庫有兩種方式,一種是系統定期自動更新,另一種是執行命令updatedb手動更新數據庫。
注意:索引構建過程需要遍歷整個根文件系統,極消耗資源
2.它的工作特性:
1.因為是基于數據庫實現的,所以查找速度快(實際生產中find也不必locate慢多少)
2.模糊查找,路徑中任何一部分包含關鍵字都顯示
3.因為是基于數據庫實現的,所以非實時查找。如果新建了一個文件卻沒有更新數據庫,則用locate是找不到的。
3.它的使用方法:
locate [OPTION]…PATTERN…
-b:只匹配路徑中的基名,但仍是模糊查找
-c:統計出共有多少個符合條件的文件
-r:基于BRE基本正則表達式來編寫模式
例:[root@pxe49 ~]# locate -r “\<passwd$”
/etc/passwd
/etc/pam.d/passwd
/usr/bin/passwd
/usr/share/bash-completion/completions/passwd
find:
1.它是實時查找工具,通過遍歷指定起始路徑下文件系統層級結構來完成文件查找。
2.它的工作特性:
1.查找速度略慢,但實際生產中服務器配置都很高,所以查找速度并不比locate慢多少。
2.由于每次查找都相當于遍歷最新的整個文件系統,所以是精確查找。
3.由于每次查找都相當于遍歷最新的整個文件系統,所以又是實時查找。
3.它的使用方法:
find [OPTIONS] [查找起始路徑] [查找條件] [處理動作,如刪除移動顯示]
查找起始路徑:指定具體搜索目標起始路徑,默認為當前目錄
查找條件:指定的查找標準,可以根據文件名(通配),大小,類型,從屬關系,權限等等標準進行,默認為找出指定路徑下的所有文件
處理動作:對符合查找條件的文件作出的操作,例如刪除等操作,默認為輸出至標準輸出。
find查找條件詳解:
1.根據文件名查找:
-name “pattern”
-iname “pattern” //不區分大小寫
注:此處的pattern不是正則表達式,是支持glob風格的通配符:*,?,[],[^]
-regex pattern:基于正則表達式模式查找文件,查找方式是根據整個路徑(類似于locate),而非基名,很少用到。
2.根據文件從屬關系查找:
-user USERNAME:查找屬主為指定用戶的所有文件
-group GRPNAME:查找屬組為指定組的所有文件
-uid UID:查找屬主為指定的UID的所有文件
-gid GID:查找屬組為指定的GID的所有文件
-nouser:查找沒有屬主的文件
-nogroup:查找沒有屬組的文件
3.根據文件類型查找:
-type TYPE:
f:普通文件
d:目錄文件
l:符號鏈接文件(軟鏈接文件)
b:塊設備文件
c:字符設備文件
p:管道文件
s:套接字文件
4.根據文件的大小查找:
-size[+|-]#UNIT
常用單位:k,M,G
~]find /tmp 174k
#UNIT:(#-1,#]開區間內,準確的說是找到(173k,174k]
-#UNIT:[0,#-1] [0,173k]
+#UNIT:(#,oo) (174,oo)
5.根據時間戳查找:
以“天”為單位:
-atime [+|-]#
#:[#,#-1)
-#:(#,0]
+#:(oo,#-1]
//比如,查找距離現在3天為打開的文件,則實際上是[3,4)天,+#是距今[4,oo]天,-#是距今少于3天
-mtime
[root@localhost ~]# find /etc -mtime -1
-ctime
以“分鐘“為單位
-amin
-mmin
-cmin
6.根據權限查找:
-perm[/|-]mode
mode:精確權限匹配
[root@localhost test]# touch a b c d e f g
[root@localhost test]# ll
總用量 0
-rw-r–r–. 1 root root 0 3月 15 21:53 a
-rw-r–r–. 1 root root 0 3月 15 21:53 b
-rw-r–r–. 1 root root 0 3月 15 21:53 c
-rw-r–r–. 1 root root 0 3月 15 21:53 d
-rw-r–r–. 1 root root 0 3月 15 21:53 e
-rw-r–r–. 1 root root 0 3月 15 21:53 f
-rw-r–r–. 1 root root 0 3月 15 21:53 g
[root@localhost test]# chmod 640 a
[root@localhost test]# chmod 666 b
[root@localhost test]# chmod 440 c
[root@localhost test]# chmod 775 d
[root@localhost test]# chmod 777 e
[root@localhost test]# ll
總用量 0
-rw-r—–. 1 root root 0 3月 15 21:53 a
-rw-rw-rw-. 1 root root 0 3月 15 21:53 b
-r–r—–. 1 root root 0 3月 15 21:53 c
-rwxrwxr-x. 1 root root 0 3月 15 21:53 d
-rwxrwxrwx. 1 root root 0 3月 15 21:53 e
-rw-r–r–. 1 root root 0 3月 15 21:53 f
-rw-r–r–. 1 root root 0 3月 15 21:53 g
[root@localhost test]# find ./ -perm 644 -ls
2230844 0 -rw-r–r– 1 root root 0 3月 15 21:53 ./f
2230845 0 -rw-r–r– 1 root root 0 3月 15 21:53 ./g
/mode:任何一類用戶(u,g,o)的權限中的任何一位(r,w,x)符合條件即滿足。(用于找至少有一個用戶有某個權限的) 存在或者的關系。即9位權限有1位符合就OK
find ./ -perm /222 -ls,查找至少有一類用戶有寫權限
find ./ -perm /111 -ls,查找至少有一類用戶有可執行權限
find ./ -perm /001 -ls,查找其他用戶是否有可執行權限
-mode:每一類用戶(u,g,o)的權限中的每一位(r,w,x)同時符合條件即滿足。
find ./ -perm -222 -ls //查找每一類用戶都有w權限
find ./ -not -perm -222 -ls//至少有一個用戶沒有w權限
注意:出現0表示不管它
find ./ -perm /002 -ls
find ./ -perm -002 -ls 它們是一樣的。
組合測試(加在兩個查找條件之間)(將多個條件以與或非連接起來):
與:-a,與是默認組合邏輯
或:-o,
非:-not,!
例:~]# find /tmp -not -type f -ls //查找tmp目錄下的非普通文件并顯示。
[root@localhost ~]# find /etc -name “passwd” //查找etc目錄下基名為passwd的文件。
/etc/pam.d/passwd
/etc/passwd
德摩根定律:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
find處理動作詳解:
-print:將查找到的文件的路徑輸出至標準輸出,默認的動作
-ls:類似于對查找到的文件執行“ls -l”命令,輸出文件的詳細信息
-delete:刪除查找的文件,危險操作,請勿嘗試
-fls /PATH/TO/SOMEFILE:把查找到的所有文件的長格式(詳細)信息保存至指定文件中
-ok COMMAND {} \; (固定格式): 對查找到的每個文件執行由COMMAND表示的命令,每次操作都由用戶確認
-exec COMMAND{} \; :對查找到的每個文件執行由COMMAND表示的命令,不與用戶交互。
find ./ -perm /002 -exec mv {} {}.danger \;
注意:{}表示你查找到的文件的文件名。
上一條命令表示將找到的權限為/002的文件的文件名后面加上.danger
注意:find傳遞查找到的文件路徑至后面的命令時,是查找出所有符合條件的文件路徑,并一次性傳遞給后面的命令。但是有些命令不能接受過長的參數,此時命令執行會失敗。另一種方式可規避此問題。用xargs
find | xargs COMMAND 通過管道送給xargs,由xargs調用命令!
原創文章,作者:3,如若轉載,請注明出處:http://www.www58058.com/73050
詳細介紹了linux系統下的查找類(locate,find)命令的使用,內容介紹的非常詳細,但需要注意一下排版問題。
@renjin:Good point. I hadn’t thhugot about it quite that way. :)