文件查找命令find、local

在文件系統上查找符合條件的文件工具有兩個:locate、find

Locate

爲非實時查找,依賴於事先構建的索引數據庫(/var/lib/mlocate/mlocate.db);索引數據庫是在系統較爲空閒時自動進行的(週期性任務),管理員也可手動更新數據庫:updatedb ; 但索引構建過程需要遍歷整個根文件系統,極消耗資源。
locate擁有的工作特性:查找速度快;支持模糊查找;非實時查找;搜索的時文件的全路徑,而不僅僅時文件名;可能只搜索用戶具備讀取和執行權限的目錄;
Locate的使用:locate KEYWORD
選項:-i 不區分大小寫
-n N 只列舉前N個匹配選項
-r 使用基本正則表達式

Find

實時查找工具,通過遍歷指定起始路徑下文件系統層級結構完成文件查找;
工作特性:查找速度略慢;精確查找;實時查找;
用法: find [OPTIONS] [查找起始路徑] [查找條件] [處理動作]
查找起始路徑:指定具體搜索目標起始路徑;默認爲當前目錄;
查找條件:指定的查找標準,可以根據文件名、大小、類型、從屬關係、權限等等標準進行;默認爲找出指定路徑下的所有文件;
處理動作:對符合查找條件的文件做出的操作,例如刪除等操作;默認爲輸出至標準輸出;
查找條件:表達式:選項和測試
測試:結果通常爲布爾型("true", "false")
按搜索層級:
-maxdepth lieve 最大搜索目錄層級;


[root@CentOS7 ~]#find /etc -maxdepth 3

-mindepth level 最小搜索目錄層級;

[root@CentOS7 ~]#find /etc -mindepth 5

搜索目錄層級3-5:


[root@CentOS7 ~]#find /etc -mindepth 3 -maxdepth 5

根據文件名查找:
-name "文件名稱" 文件名查找:支持glob風格的通配符;*, ?, [], [^]

[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的文件


[root@CentOS7 /]#find -links 20

-regex pattern:基於正則表達式模式查找文件,匹配是整個路徑,而非其名;

根據文件從屬關係查找:
-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空文件f1、f2、...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    //查找有特殊權限的文件 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章