文件查找
我們常常需要知道哪個文件放在哪里,才能夠對該文件進行一些修改或維護等動作。 有些時候某些軟件配置文件的文件名是不變的,但是各發行版 放置的目錄則不同。 此時就得要利用一些搜尋指令將該配置文件的完整文件名捉出來,這樣才能修改。
比較實用的兩個文件查找工具locate和find。
locate 是利用數據庫(數據庫每天由系統自動更新)來搜尋文件名,特點是查找速度快,模糊查找,非實時查找。find 是很強大的搜尋指令,但時間花用的很大,精確查找而且是實時查找!(因為 find 是直接遍布硬盤查找)
locate
這個 locate 使用很簡單,直接在后面輸入“文件的部分名稱”后,就能夠得到結果。
-b:只匹配路徑中的基名
-c:統計出共有多少個符號條件的文件
-r:BRE,支持基本正則表達式
updatedb:構建locate查找索引
注意:索引構建過程需要遍歷整個根文件系統,極消耗資源:
find:
實時查找工具,通過遍歷指定起始路徑下文件層級結構完成文件查找;選項眾多,功能比locate強大很多
語法:
find [OPTION]… [查找路徑] [查找條件] [處理動作]
查找路徑:指定具體目標路徑;默認為當前目錄
查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認為找出指定路徑下的所有文件
處理動作:對符合條件的文件做操作,默認輸出至屏幕
查找條件
根據文件名和inode查找:
-name "文件名稱":支持使用glob *, ?, [], [^]
-iname "文件名稱":不區分字母大小寫
-inum n 按inode號查找
-samefile name 相同inode號的文件
-links n 鏈接數為n的文件
-regex "PATTERN":以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名稱
示例
根據屬主、屬組查找:
-user USERNAME:查找屬主為指定用戶(UID)的文件
-group GRPNAME: 查找屬組為指定組(GID)的文件
-uid UserID:查找屬主為指定的UID號的文件
-gid GroupID:查找屬組為指定的GID號的文件
-nouser:查找沒有屬主的文件
-nogroup:查找沒有屬組的文件
示例
根據文件類型查找:
-type TYPE:
f: 普通文件
d: 目錄文件
l: 符號鏈接文件
s:套接字文件
b: 塊設備文件
c: 字符設備文件
p: 管道文件
示例
根據文件大小來查找:
-size [+|-]#UNIT
常用單位: k, M, G
#UNIT: (#-1, #]
如: 6k 表示(5k,6k]
-#UNIT: [0,#-1]
如: -6k 表示[0,5k]
+#UNIT: (#,∞)
如: +6k 表示(6k,∞
示例, 注意:5K的意思就是4-5K之間的大小
注意:-5K的意思是0-4K之間的大小
注意:+5k的意思是5-∞
根據時間戳:
以“天”為單位;
-atime [+|-]#, 以4為天的單位
#: [#,#+1)
4是代表4-5那一天的文件文件名
+#: [#+1,∞]
+4代表大于等于5天前的文件名
-#: [0,#)
-4代表小于等于4天內的文件文件名
-mtime
-ctime
示例:最近2天內被訪問過的文件
以“分鐘”為單位:
-amin
-mmin
-cmin
根據權限查找:
-perm [/|-]MODE
MODE: 精確權限匹配
/MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關系, + 從centos7開始淘汰
-MODE:每一類對象都必須同時擁有指定權限,與關系,0 表示不關注
find -perm 755 會匹配權限模式恰好是755的文件
只要當任意人有寫權限時, find -perm +222就會匹配
只有當每個人都有寫權限時, find -perm -222才會匹配
只有當其它人( other)有寫權限時, find -perm -002才會匹配
示例 精確搜索權限 要求文件必須權限必須777
/444 搜索文件中任何一位u,g,o中任意一個擁有4權限位都滿足搜索條件
-444 搜索文件中每一個u,g,o都必須同時擁有4權限才滿足,任何一個u,g,o沒有4權限即不滿足搜索條件
組合條件:
與: -a
或: -o
非: -not, !
德·摩根定律:
(非 P) 或 (非 Q) = 非(P 且 Q)
(非 P) 且 (非 Q) = 非(P 或 Q)
not A or not B = not (A and B)
not A and not B = not (A or B)
非A而且非B就是非(A或B)
非A或非B就是非(A和B)
具體我們還是來示例吧
如果我要查找一個屬主不是root而且屬主也不是gdm的文件;
find /home -not -user root -not -user gdm ;這里的意思就是 非A且非B,上邊我們說了非A且非B=非(A或B),那就有另外一種方式
find /home -not \( -user root -o -user gdm \);這就是非A且非B=非(A或B)啦,記死格式就偶了
如果我要找一個屬主不是root或者屬主不是gdm的文件
find /home -not -user root -o -not -user gdm;這里的意思就是非A或非B,上邊提到非A或非B=非(A和B),那就有另外一種方式
find /home -not \( -user root -a -user gdm \);這就是非A或非B=非(A和B)。
處理動作
最簡單的處理動作有 ;-ls -delete -fls -ok cmd {} \;(-ok cmd {} \;)處理的沒一個動作都會與用戶交互;而且處理動作的執行與的關系優先與或的關系
exec COMMAND {} \; 對查找到的每個文件執行由
COMMAND指定的命令
{}: 用于引用查找到的文件名稱自身
find傳遞查找到的文件至后面指定的命令時,查找到所有符合條件的文件一次性傳遞給后面的命令
有些命令不能接受過多參數,此時命令執行可能會失敗,下面方式可規避此問題
find | xargs COMMAND
示例
將查找的文件的長格式信息保存到另外一個文件中
將查找到文件的長格式信息打印出來
將查找到的所有以f為行首的文件全部刪除掉
1、查找/var目錄下屬主為root,且屬組為mail的所有文件
2、查找/var目錄下不屬于root、lp、gdm的所有文件
3、查找/var目錄下最近一周內其內容修改過,同時屬主不為root,也不是postfix的文件
4、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件
注意:因為與的優先級比或的優先級高所有或要用括號擴起來
5、查找/etc目錄下大于1M且類型為普通文件的所有文件
6、查找/etc目錄下所有用戶都沒有寫權限的文件
所有都沒有的反面是至少有一類有
7、查找/etc目錄下至少有一類用戶沒有執行權限的文件
至少有一類沒有的反面是所有都有
8、查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件
原創文章,作者:M20-1馬星,如若轉載,請注明出處:http://www.www58058.com/36075