大家好,我是“孤雲幕雨”;祝大家中秋快樂,今天給大家帶來的是《Linux文件查找命令》
一、locate:依賴於事先構建的索引
v 依賴於事先構建的索引;索引的構建是在系統較爲空閒時自動進行(週期性任務);手動更新數據庫:updatedb
v 數據庫配置文件:/var/lib/mlocate/mlocate.db
v 索引構建過程需要遍歷整個根文件系統,極消耗資源
v 實時查找:遍歷所有文件進行條件匹配
v 非實時查找:根據索引查找
v locate工作特點
Ü 模糊查找
Ü 優勢:查找速度快
Ü 非實時查找(數據庫查找)
v 只搜索用戶具備讀取和執行權限的目錄
語法:locate 文件名
locate KEYWORD
locate [OPTION]... PATTERN...
選項:
-i:查找時,不區分大小寫
-b:只匹配路徑中的基名
-c:統計出共有多少個符合條件的文件
-n N:僅顯示前N個匹配條目
注意:索引構建過程需要遍歷整個根文件系統,極消耗資源
二、find 實時查找工具,通過遍歷指定起始路徑下文件系統層級結構完成文件查找
v find工作特點
Ü 查找速度慢
Ü 精確查找
Ü 實時查找
語法:find 查找路徑 查找條件
find 查找路徑 查找條件 處理動作
find [選項] ... 查找路徑 查找條件 處理動作
選項:
-L: 遵循符號鏈接
-P:不遵循符號鏈接
-maxdepth LEVEL: 設置最大目錄層級
-mindepth LEVEL: 設置最小目錄層級
v 查找路徑:指定具體目標路徑;默認爲當前目錄
v 查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認爲找出指定路徑下的所有文件
v 處理動作:對符合查找條件的文件做出的操作;默認輸出至屏幕
查找條件
根據文件名查找(支持使用glob風格的通配符)
v -name FileName:根據文件名稱進行查找
v -iname FileName:根據文件名進行查找,不區分字符大小寫
v -depth: 從指定目錄下最深層的子目錄開始查找
v -regex:支持正則表達式;以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名稱
[root@zhangdaifu ~]# find /etc -name network
/etc/sysconfig/network
/etc/rc.d/init.d/network
[root@zhangdaifu ~]# find /etc -maxdepth 3 -mindepth 3 -name network
/etc/rc.d/init.d/network
根據文件從屬關係查找
根據文件屬主查找
v -user UserName:查找屬主爲指定用戶的文件
根據文件屬組查找
v -group GroupName:查找屬組爲指定組的文件
根據UID查找
v -uid UID:查找屬主爲指定uid號的文件
根據GID查找
v -gid UID:查找屬組爲指定gid號的文件
查找沒有屬主屬組的文件
v -nouser:查找沒有屬主的文件
v -nogroup:查找沒有屬組的文件
根據文件類型查找
v -type 文件類型(FILE_TYPE):指定文件類型進行查找
Ü 文件類型(FILE_TYPE)
F f:普通文件
F d:目錄文件
F l:軟鏈接文件
F b:塊設備文件
F c:字符設備文件
F p:管道文件
F s:套接字文件
高級查找
組合條件查找
v -a:與;兩個條件同時滿足;默認(並且關係)
Ü 多個條件之間默認就是“並且”關係
v -o:或;兩個條件滿足一個即可(或者關係)
v -not或 !:非;條件取反
德.摩根定律
v 非A並且非B
Ü !A -a !B = !(A -o B)
v 非A或非B
Ü !A -o !B = !(A -a B)
根據文件系統查找
v -fstype FileSystem_type: 只尋找該文件系統類型下的文件或目錄
根據文件大小查找
v 開區間:不包括
v 閉區間:包括
Ü (開區間)
Ü [閉區間]
v -size [+|-]#UNIT:根據指定文件大小進行查找;選項後可以加“+或-”加減號後加上數字,數字後面加單位,常用的單位有“k、M、G”;默認以字節爲單位
Ü #UNIT: (#-1, #]
Ü -#UNIT:[0,#-1]
Ü +#UNIT:(#,oo)
Ü 半開半閉區間:#UNIT: (#-1, #],>#-1<=#
Ü 閉區間:#UNIT:[0,#-1],>0<=#-1
Ü 開區間:+#UNIT:(#,oo),>#<oo
v -expty:尋找文件大小爲0 Byte的文件,或目錄下沒有任何子目錄或文件的空目錄
根據時間戳查找
以“天”爲單位
v -atime [+|-]#:訪問時間
大於等於#小於#+1
Ü #:[#, #-1),>=3<4
Ü -#:(#, 0], <#>0
Ü +#:(oo, #-1], --oo>#-1
Ü -:在N天之內(包括N本身)被訪問過的文件
Ü +:在N天之前(不包含N本身)被訪問過的文件
v -mtime:修改時間
v -ctima:改變時間
以“分鐘”爲單位
v -amin:訪問時間
v -mmin:修改時間
v -cmin:改變時間
根據權限查找
v -perm [+|/|-] MODE:指定八進制權限位,查找對應的權限
Ü MODE:精確匹配
Ü 至少一類有 ! 所有都沒有
Ü 所有都有 ! 至少一類沒有
Ü {+|/}:任何一類用戶(u、g、o)的權限中的任何一位(r、w、x)符合條件即滿足(包含即爲有,9位權限之間存在“或”關係;任何一位滿足就行,隱藏着“或”關係)
# find / -perm +003
# 不關心屬主屬組的權限、查找其他人能寫或能執行的權限;0爲不考慮
# find ./ -perm /222 –ls
# 查找當前目錄下,至少有一位用戶有寫權限的文件
Ü -:每一類用戶(u、g、o)的權限中的每一位(r、w、x)同時符合條件即滿足(9位權限之間存在“與”關係,隱藏着“與”關係)
666(包含,包含,包含)
766:符合
760:不符合
find / -not -perm 222
# 至少有一類用戶沒有寫權限
find / -perm -003
# 不關心屬主屬組的權限、其他人需同時擁有w和x權限極爲符合
注:在RHEL 7/CentOS 7上“+”被廢掉,被替換成“/”
根據文件新舊查找
v -newer
Ü 選項後+文件名+文件類型;查找比指定文件新的文件
Ü 選項前+邏輯非+文件類型;查找比指定文件舊的文件
Ü 選項後+文件1+邏輯非+選項+文件2+文件類型;查找比文件1新,比文件2舊的文件
根據Inode查找
v -inum INODE:根據Inode進行查找
v -samefile NAME:查找相同Inode的文件
v 根據Inode刪除文件
Ü 當文件名太複雜不好刪除時,可以根據Inode將其刪除
find . -inum INODE -print -exec rm {} -rf \;
find . -inum INODE -print -exec rm -rf {} \;
根據文件被鏈接的次數進行查找
v -links N:查找被[硬]鏈接N次的文件
處理動作
v -print:默認的動作;將查找到的內容輸出到標準輸出(屏幕)
v -ls:類似於對查找到的文件執行ls –l命令
v -delete:刪除查找到的文件;操作有風險,確認需謹慎
v -fprint /PATH/TO/SOMEFILE:將查找到的文件保存到指定文件中,如果文件不存在則創建之
v -fls /PATH/TO/SOMEFILE:查把查找到的所有文件的長格式信息保存至指定文件中
v -ok COMMAND {} \; :對查找到的每個文件執行由COMMAND指定的命令;對於每個文件執行命令之前,都會交互式要求用戶確認
v -exec COMMAND {} \; :對查找到的每個文件執行由COMMAND指定的命令;無需用戶確認!
v {}:用於引用查找到的文件名稱自身
注意:find傳遞查找到的文件至後面指定的命令時,查找到所有符合條件的文件一次性傳遞給後面的命令;有些命令不能接受過多參數,此時命令執行可能會失敗
另一種方式可規避此問題
語法格式:find | xargs COMMAND
find命令練習
find命令練習 (1)
1、找出/tmp目錄下屬主爲非root的所有文件
# find /tmp -not -user root
2、找出/tmp目錄下文件名中不包含fstab字符串的文件
# find /tmp -not -iname '*fstab*'
3、找出/tmp目錄下屬主爲非root,而且文件名不包含fstab字符串的文件
# find /tmp -not \( -user root -o -iname '*fstab*' \)
4、找出當前系統下文件名帶有~的文件
# find / -name *\~*
find命令練習 (2)
1、查找/var目錄下屬主爲root,且屬組爲mail的所有文件或目錄
# find /var -user root -group mail
2、查找/usr目錄下不屬於root,bin或zhangdaifu的所有文件或目錄用兩種方法
# find /usr -not -user root -not -user bin -not -user zhangdaifu
find /usr -not \( -user root -o -user bin -o -user zhangdaifu \)
3、查找/etc目錄下最近一週內其內容修改過,且屬主不是root用戶也不是zhangdaifu用戶的文件或目錄
# find /etc -mtime -7 -not \( -user root -o -user zhangdaifu \)
4、查找當前系統上沒有屬或屬組,且最近一週內曾被訪問過的文件或目錄
# find / \( -nouser -a -nogroup \) -a -atime -7
5、查找/etc目錄下大於1M且類型爲普通文件的所有文件
# find /etc -type f -size +1M
6、查找/etc目錄下所有用戶都沒有寫權限的文件
# find /etc -not -perm /222 -type f
7、查找/etc目錄至少有一類用戶沒有執行權限的文件
# find /etc -not -perm -111 -type f
8、查找/etc/init.d/目錄下,所有用戶都有執行權限,且其它用戶有寫權限的所有文件
# find /etc/init.d/ -perm -113 -type f
find /etc/init.d/ -type f -perm -111 -a -perm -002
文件系統查找
findfs 通過標籤或UUID查找文件系統
語法:findfs LABEL=label
findfs UUID=uuid
根據UUID進行查找
[root@localhost ~]# findfs UUID=6a7eb833-5bd7-4e73-8766-4de1607ecb90
/dev/sda5
根據卷標進行查找
[root@localhost ~]# findfs LABEL=DATA_DISKS
/dev/sdb