Linux查找工具locate和find


linux 中有很多查找工具,今天主要講解locate,find兩個工具。

一、locate

1、性能介紹

非實時查找(數據庫查找):locate

查詢系統上預建的文件索引數據庫

  /var/lib/mlocate/mlocate.db  

注意:如果這個文件刪除了,locate就無法使用了。需手動手動更新數據庫(updatedb),或重啟系統,locate才能恢復作用。

依賴於事先構建的索引:

  • 索引的構建是在系統較為空閑時自動進行(周期性任務),管理員手動更新數據庫(updatedb)
  • 索引構建過程需要遍歷整個根文件系統,極消耗資源

2.工作特點:

  • 查找速度快
  • 模糊查找
  • 非實時查找
  • 搜索的是文件的全路徑,不僅僅是文件名
  • 可能只搜索用戶具備讀取和執行權限的目錄

locate命令用法:

有用的選項

-i不區分大小寫的搜索
-n N只列舉前N個匹配項目
-r 使用正則表達式

  示例
搜索名稱或路徑中帶有“conf”的文件

locate conf

使用Regex來搜索以“.conf”結尾的文件

locate -r ‘\.conf$’

 

 二、find

實時查找工具,通過遍歷指定路徑完成文件查找

工作特點:

  • 查找速度略慢
  • 精確查找
  • 實時查找
  • 可能只搜索用戶具備讀取和執行權限的目錄

find用法格式

find [OPTION]... [查找路徑] [查找條件] [處理動作]

  • 查找路徑:指定具體目標路徑;默認為當前目錄
  • 查找條件:指定的查找標准,可以文件名、大小、類型、權限等標准進行;默認為找出指定路徑下的所有文件
  • 處理動作:對符合條件的文件做操作,默認輸出至屏幕

查找條件

1、指搜索層級

-maxdepth  level 最大搜索目錄深度,指定目錄為第1級
-mindepth  level 最小搜索目錄深度
-depth  先處理目錄內的文件,再處理目錄

 示例:

  

2、根據文件名和inode查找:

-name "文件名稱":支持使用glob
*, ?, [], [^]
-iname"文件名稱":不區分字母大小寫
-inum  n 按inode號查找
-samefile   name 相同inode號的文件
-links  n 鏈接數為n的文件
-regex“PATTERN”:以PATTERN匹配整個文件路徑,而非文件名稱

 示例:

  

3、根據屬主、屬組查找:

-user USERNAME:查找屬主為指定用戶(UID)的文件
-group GRPNAME: 查找屬組為指定組(GID)的文件
-uid   UserID:查找屬主為指定的UID號的文件
-gid  GroupID:查找屬組為指定的GID號的文件
-nouser:查找沒有屬主的文件
-nogroup:查找沒有屬組的文件

 示例:

4、根據文件類型查找:
-type TYPE:

•f: 普通文件
•d: 目錄文件
•l: 符號鏈接文件
•s:套接字文件
•b: 塊設備文件
•c: 字符設備文件
•p: 管道文件

 示例:

 5、空文件或目錄

-empty
find /app -type d -empty  查找app目錄下空目錄

 示例:

[root@centos7data]#find /data  -empty  查找data目錄下空文件。
/data/f1

6、組合條件查找:

與:-a
或:-o
非:-not, !

 注意:-a的優先級高於-o,如果先查詢-o選項,需要加括號,再查詢-a選項即可。

 德·摩根定律:

(非A) 或(非B) = 非(A 且B)

(非A) 且(非B) = 非(A 或B)

 示例:

[root@centos7data]#find  /data  \( -name "*.sh" -o -user root \) -ls   如果不加括號,會先判斷用戶名和ls選項,后者是與的關系,查找完之后才會再與前面的選項進行或的關系查找.sh后綴的文件。
    64    0 drwxr-xr-x   2 root     root           45 Dec 19 10:41 /data
    69    4 -rw-r--r--   2 liu      liu           506 Dec 18 17:08 /data/tuzi.sh
    69    4 -rw-r--r--   2 liu      liu           506 Dec 18 17:08 /data/f11.sh
    67    0 -rw-r--r--   1 root     root            0 Dec 19 10:41 /data/f1
[root@centos7data]#find  / -name "*.sh" -a -user root -ls | head -3
1577740    4 -rw-r--r--   1 root     root         2251 Aug 22 15:40 /boot/grub2/i386-pc/modinfo.sh
201734719    4 -rwxr-xr-x   1 root     root          543 Apr 11  2018 /etc/X11/xinit/xinitrc.d/localuser.sh
201804061    4 -rwxr-xr-x   1 root     root          621 Oct 30  2018 /etc/X11/xinit/xinitrc.d/00-start-message-bus.sh

德摩根定律示例:

[root@centos7~]#find /data ! -name "*.sh" -o ! -user liu > /root/f1.txt  非A或非B
[root@centos7~]#find /data ! \( -name "*.sh" -a -user liu \) > /root/f2.txt  非(A且B)
[root@centos7~]#diff f1.txt f2.txt   #判斷文件是否一致,不顯示結果就是一致

 

 find示例:

找出/tmp目錄下,屬主不是root,且文件名不以f開頭的文件
find /tmp  \( -not -user root -a -not -name 'f*' \) -ls
find /tmp -not  \( -user root -o -name 'f*' \) –ls

排除目錄  

查找/etc/下,除/etc/sane.d目錄的其它所有.conf后綴的文件
find /etc -path '/etc/sane.d' -a –prune -o -name “*.conf"
查找/etc/下,除/etc/sane.d和/etc/fonts兩個目錄的所有.conf后綴的文件 find /etc \( -path "/etc/sane.d" -o -path "/etc/fonts" \) -a -prune -o -name "*.conf"

7、查找條件

根據文件大小來查找:

-size [+|-]#UNIT

常用單位:k, M, G,c(byte)

#UNIT: (#-1, #]
如:6k 表示(5k,6k]
-#UNIT:[0,#-1]
如:-6k 表示[0,5k]
+#UNIT:(#,∞)
如:+6k 表示(6k,∞)

 示例:

  

8、根據時間戳:

以“天”為單位

-atime[+|-]#, 訪問時間
#: [#,#+1)    如:3  [3,4)
+#: [#+1,∞]   如:+3  [4,∞]
-#: [0,#)     如:-3  [0,3)
-mtime 
-ctime

以“分鍾”為單位

-amin
-mmin
-cmin

示例:

[root@centos7~]#find / -atime  +2  訪問兩天以上的文件
[root@centos7~]#find / -atime   -3   訪問3天內的文件

9、根據權限查找:

-perm [/|-]MODE

MODE: 精確權限匹配

/MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關系,+ 從centos7開始淘汰
-MODE:每一類對象都必須同時擁有指定權限,與關系

 注意: 0 表示不關注

  • find -perm  755 會匹配權限模式恰好是755的文件
  • 只要當任意人有寫權限時,find  -perm  /222  就會匹配
  • 只有當每個人都有寫權限時,find  -perm  -222  才會匹配
  • 只有當其它人(other)有寫權限時,find  -perm  -002 才會匹配

  演示:find  -perm  /222   

  1、第一個2是u的讀權限(010中的0不關注)

  2、第二個2是g的讀權限(010中的0不關注)

  3、第三個2是o的讀權限(010中的0不關注)

示例:

 以下四種寫法都是查找other位置的寫權限,由於是other位置,所以是“與”和“或者”的關系都可以查找,可以省略最高位的兩個0。

[root@centos7data]#find  -perm /002
[root@centos7data]#find -perm /2
[root@centos7data]#find -perm -2
[root@centos7data]#find -perm -002

 處理動作

-print:默認的處理動作,顯示至屏幕
-ls:類似於對查找到的文件執行“ls -l”命令
-delete:刪除查找到的文件
-fls file:查找到的所有文件的長格式信息保存至指定文件中
-ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令,對於每個文件執行命令之前,都會交互式要求用戶確認(交互式處理)

 -exec用法:

-exec COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令 (非交互式處理)
{}: 用於引用查找到的文件名稱自身
find傳遞查找到的文件至后面指定的命令時,查找到所有符合條件的文件一次性傳遞給后面的命令

示例:

[root@centos7data]#find ! -type d -perm /222   篩選非222權限的目錄
./f1
[root@centos7data]#find ! -type l -perm /222 -delete   篩選出非222權限的節點編號進行刪除
[root@centos7data]#find -perm -222 -ls > test.txt  將222權限的文件進行導入test.txt文件中
[root@centos7data]#find -perm -222 -fls  test1.txt 與上者用法相同,都是導入到test.txt文件中
[root@centos7data]#diff test.txt test1.txt   比較兩者的區別。
[root@centos7data]#find -perm /222 -name "*.txt" -ok cp {} /root \;  篩選出權限有一個是2的.txt后綴的文件進行復制到root目錄下,-ok為交互式復制,會問用戶是否操作,大批量操作,則不方便。
< cp ... ./test.txt > ? y
< cp ... ./test1.txt > ? y
[root@centos7data]#find -perm /222 -name "*.txt" -exec rm  {} \;  篩選出的文件進行刪除處理。

 示例:生成一個大文件並刪除或者移動大於10M以上的文件。

[root@centos7data]#dd if=/dev/zero of=bigfile bs=1M count=11  生成一個11M大文件
11+0 records in
11+0 records out
11534336 bytes (12 MB) copied, 0.010788 s, 1.1 GB/s
[root@centos7data]#ls
bigfile  f1  f2  f3  f4  f5  f6  f7
[root@centos7data]#find /data  -size +10M -exec mv {} /root \;  將10M大文件移動到root目錄下
[root@centos7data]#ls
f1  f2  f3  f4  f5  f6  f7
[root@centos7data]#ls /root
anaconda-ks.cfg  Desktop    Downloads  f2.txt                lvs_dr_rs.sh  Pictures  Templates  test.txt
bigfile          Documents  f1.txt     initial-setup-ks.cfg  Music         Public    test1.txt  Videos
[root@centos7data]#find /data  -size +10M -exec rm {} \;  將10M大文件刪除。

 參數傳到替換xargs  

1、由於很多命令不支持管道|來傳遞參數,而日常工作中有這個必要,所以就有了xargs命令

2、xargs用於產生某個命令的參數,xargs可以讀入stdin的數據,並且以空格符或回車符將stdin的數據分隔成為arguments

注意:文件名或者是其他意義的名詞內含有空格符的情況

有些命令不能接受過多參數,命令執行可能會失敗,xargs可以解決

示例:

ls f* |xargs  rm

find  /sbin  -perm +700 | ls -l 這個命令是錯誤的

find  /sbin  -perm +7000 | xargs  ls -l 查找特殊權限的文件

find和xargs格式:find  |  xargs  COMMAND

  有些命令不能接受過多參數 ,命令執行可能會失敗,xargs可解決
   例如:touch , rm 不能一次執行超過一定的參數(大概30000)
[root@centos17data]#echo f{1..30000} | xargs  touch
[root@centos17data]#find -name "f*" | xargs rm

備份配置文件,添加.orig這個擴展名

find   -name   “*.conf” -exec cp  {}  {}.orig  \;

提示刪除存在時間超過3天以上的joe的臨時文件

find   /tmp  -ctime  +3 -user  joe  -ok  rm {}  \;

在主目錄中尋找可被其它用戶寫入的文件

find  ~  -perm  -002 -exec  chmod  o-w  {}  \;

查找/data下的權限為644,后綴為sh的普通文件,增加執行權限

find /data –type f -perm 644 -name “*.sh” –exec  chmod  755 {} \;

查看/home的目錄

find /home -type d -ls

  

 

  

  

  

 

  

  

 

 

  

  

  

  

 

 

  

  

  

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM