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
[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