爲非實時查找,依賴於事先構建的索引數據庫(/var/lib/mlocate/mlocate.db);索引數據庫是在系統較爲空閒時自動進行的(週期性任務),管理員也可手動更新數據庫:updatedb ; 但索引構建過程須要遍歷整個根文件系統,極消耗資源。
locate擁有的工做特性:查找速度快;支持模糊查找;非實時查找;搜索的時文件的全路徑,而不單單時文件名;可能只搜索用戶具有讀取和執行權限的目錄;
Locate的使用:locate KEYWORD
選項:-i 不區分大小寫
-n N 只列舉前N個匹配選項
-r 使用基本正則表達式node
實時查找工具,經過遍歷指定起始路徑下文件系統層級結構完成文件查找;
工做特性:查找速度略慢;精確查找;實時查找;
用法: find [OPTIONS] [查找起始路徑] [查找條件] [處理動做]
查找起始路徑:指定具體搜索目標起始路徑;默認爲當前目錄;
查找條件:指定的查找標準,能夠根據文件名、大小、類型、從屬關係、權限等等標準進行;默認爲找出指定路徑下的全部文件;
處理動做:對符合查找條件的文件作出的操做,例如刪除等操做;默認爲輸出至標準輸出;
查找條件:表達式:選項和測試
測試:結果一般爲布爾型("true", "false")
按搜索層級:
-maxdepth lieve 最大搜索目錄層級;正則表達式
[root@CentOS7 ~]#find /etc -maxdepth 3
-mindepth level 最小搜索目錄層級;數據庫
[root@CentOS7 ~]#find /etc -mindepth 5
搜索目錄層級3-5:bash
[root@CentOS7 ~]#find /etc -mindepth 3 -maxdepth 5
根據文件名查找:
-name "文件名稱" 文件名查找:支持glob風格的通配符;*, ?, [], [^]ide
[root@CentOS7 ~]#find /etc -name "fstab" [root@CentOS7 data]#find /data -name "*.sh"
-iname "pattern" 不區分字母大小寫工具
[root@CentOS7 data]#find /etc -iname "*.SH"
-inum N 按inode 號查找測試
[root@CentOS7 data]#find -inum 71 //查看文件的inode號:ls -i
-samefile name 相同inode號的文件
-links N 鏈接數爲N的文件ui
[root@CentOS7 /]#find -links 20
-regex pattern:基於正則表達式模式查找文件,匹配是整個路徑,而非其名;code
根據文件從屬關係查找:
-user USERNAME:查找屬主指定用戶的全部文件;
-group GRPNAME:查找屬組指定組的全部文件;
-uid UID:查找屬主指定的UID的全部文件;
-gid GID:查找屬組指定的GID的全部文件;
-nouser:查找沒有屬主的文件;
-nogroup:查找沒有屬組的文件;索引
根據文件的類型查找:
-type TYPE:
f: 普通文件
d: 目錄文件
l:符號連接文件
b:塊設備 文件
c:字符設備文件
p:管道文件
s:套接字文件
查找空文件或目錄:-empty
[root@CentOS7 /]#find /etc -type f -empty find /etc -size +1M -type f –ls #-type 後表示文件類型的不須要在加 -,只有是find的參數才加 -
組合測試:
與:-a, 默認組合邏輯;
或:-o
非:-not, !
根據文件的大小查找:
-size [+|-]#UNIT
Unit的經常使用單位:k, M, G
#UNIT:(#-1, #]
-#UNIT:[0,#-1]
+#UNIT:(#, oo)
根據時間戳查找:
以「天」爲單位:
-atime [+|-]#
#:[#, #-1)
-#:(#, 0]
+#:(oo, #-1]
-mtime
-ctime
以「分鐘」爲單位: -amin -mmin -cmin
根據權限查找:
-perm [/|-]mode
mode:精確權限匹配; 例:find /tmp –perm 664
/mode:任何一類用戶(u,g,o)的權限中的任何一位(r,w,x)符合條件即知足;
9位權限之間存在「或」關係; 例:find /tmp –perm /222 –ls
-mode:每一類用戶(u,g,o)的權限中的每一位(r,w,x)同時符合條件即知足;
9位權限之間存在「與」關係;
處理動做:
-print:輸出至標準輸出;默認的動做;
-ls:相似於對查找到的文件執行「ls -l」命令,輸出文件的詳細信息;
-delete:刪除查找到的文件;(危險動做)
-fls /PATH/TO/SOMEFILE:把查找到的全部文件的長格式信息保存至指定文件中;
-ok COMMAND {} \; :對查找到的每一個文件執行由COMMAND表示的命令;每次操做都由用戶進行確認;
例:find /tmp –nouser –nogroup –ok chown root:root {} \; #修改沒有用戶和用戶組的文件,而後加上root用戶。
注意:{}爲查找到的文件名的集合,\; 爲固定格式。
-exec COMMAND {} \; :對查找到的每一個文件執行由COMMAND表示的命令;{}用於查找到的文件自己;
例:find /tmp –perm /002 –exec mv {} {}.danger \; #修改其餘用戶有寫權限的文件,將其文件名後面加上danger
注意:find傳遞查找到的文件路徑至後面的命令時,是先查找出全部符合條件的文件路徑,並一次性傳遞給後面的命令;
可是有些命令不能接受過長的參數,此時命令執行會失敗;另外一種方式可規避此問題:xargs命令
參數替換:Xargs
因爲不少命令不支持管道|來傳遞參數,xargs用於產生某個命令的參數,xargs 能夠讀入 stdin 的數據,而且以空格符或回車符將 stdin 的數據分隔成爲參數;
使用語法:COMMAND | xargs COMMAND
示例1:批量touch空文件f一、f二、...fn,
[root@CentOS7 testdir1]#touch f{1..1000} //當參數少時能夠執行成功 [root@CentOS7 testdir1]#touch f{1..2323232} //但當參數多了後,就會提示參數列表過長 -bash: /usr/bin/touch: Argument list too long
解決辦法:使用xargs
[root@CentOS7 testdir1]#echo f{1..634343} |xargs touch
參數較長時,執行的時間會過長,此時咱們可使用df -i命令查看磁盤inode的使用狀況
示例2:批量建立用戶:
咱們都知道建立用戶時useradd只能一次建立一個用戶,當useradd後寫多個用戶名,或使用管道將多個用戶做爲參數傳給useradd時,系統都會報錯,以下:
[root@CentOS7 testdir1]#useradd user1 user2 [root@CentOS7 testdir1]#echo user{1..10} |useradd 此時,咱們可藉助xargs, xargs 能夠讀入 stdin 的數據,而且以空格符或回車符將 stdin 的數據分隔成爲參數 [root@CentOS7 testdir1]#echo user{1..10} |xargs -n 1 useradd //-n N 表示一次傳遞給command一個參數 [root@CentOS7 testdir1]#tail /etc/passwd //查看發現用戶確實已批量建立 user1:x:1006:1006::/home/user1:/bin/bash user2:x:1007:1007::/home/user2:/bin/bash user3:x:1008:1008::/home/user3:/bin/bash user4:x:1009:1009::/home/user4:/bin/bash user5:x:1010:1010::/home/user5:/bin/bash user6:x:1011:1011::/home/user6:/bin/bash user7:x:1012:1012::/home/user7:/bin/bash user8:x:1013:1013::/home/user8:/bin/bash user9:x:1014:1014::/home/user9:/bin/bash user10:x:1015:1015::/home/user10:/bin/bash
[root@CentOS7 testdir1]#echo user{1..10} |xargs -n 1 userdel -r //固然咱們也能夠批量刪除用戶
##刪除當前目錄下的大量文件
[root@CentOS7 testdir1]#ll |wc -l //查看可知當前目錄有634324個文件,如何大量刪除呢? 634324 [root@CentOS7 testdir1]#ls |xargs rm //使用xargs 批量刪除 [root@CentOS7 testdir1]#ll total 0 find /bin/ -perm /7000 | xargs ls -Sl //查找有特殊權限的文件