Linux 文件查找命令詳解

    大家好,我是“孤雲幕雨”;祝大家中秋快樂,今天給大家帶來的是《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根據指定文件大小進行查找;選項後可以加“+-”加減號後加上數字,數字後面加單位,常用的單位有“kMG”;默認以字節爲單位

Ü  #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精確匹配

Ü  至少一類有 ! 所有都沒有

Ü  所有都有 ! 至少一類沒有

Ü  {+|/}:任何一類用戶(ugo)的權限中的任何一位rwx)符合條件即滿足(包含即爲有,9位權限之間存在“或”關係;任何一位滿足就行,隱藏着“或”關係

# find / -perm +003

不關心屬主屬組的權限、查找其他人能寫或能執行的權限;0爲不考慮

# find ./ -perm /222 –ls

      # 查找當前目錄下,至少有一位用戶有寫權限的文件

Ü  -:每一類用戶(ugo)的權限中的每一位(rwx同時符合條件即滿足(9位權限之間存在“與”關係,隱藏着“與”關係

666(包含,包含,包含)

      766:符合

      760:不符合

find / -not -perm 222

至少有一類用戶沒有寫權限

find / -perm -003

不關心屬主屬組的權限、其他人需同時擁有wx權限極爲符合

    注:在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,binzhangdaifu的所有文件或目錄用兩種方法

# 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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章