文件查找命令之locate、find簡析
在工作中經常會在文件系統上查找符合條件的文件,今天學習了文件查找命令,在此簡析locate和find兩個文件查找工具。
一、雜項知識整理
1、find的選項-user的實質是通過UID查找,如果兩個用戶的UID相同,其會顯示兩個用戶的所有符合條件的文件。
2、查找時-name "*.txt"中的文件名必須加雙引號。
3、find查找的時候,如果對象是個目錄的軟鏈接,需要加/,如果不加/則默認把目錄看做一個文件進行查找,加了/之后會通過鏈接進入真是目錄中進行文件的查找,例如:
[root@localhost etc]# find /etc/rc3.d -perm /200 /etc/rc3.d [root@localhost etc]# find /etc/rc3.d/ -perm /200 /etc/rc3.d/ /etc/rc3.d/K50netconsole /etc/rc3.d/S10network
4、按時間和大小查找的圖解:
二、命令詳解及事例
1、locate命令:在文件系統上查找符合條件的文件:
依賴于實現構建好的索引庫,其索引庫是系統自動建立并周期性自動更新的,手動更新數據庫用updatedb。
工作特性:查找速度快,模糊查找,非實時查找,更新數據庫索引需要遍歷整個根文件系統,極其消耗系統資源。
-b 只查找路徑中的基名
-r 擴展正則表達式
-c 統計出共多少個符合條件,-bc
-w 路徑名
-i 忽略字符大小寫
-n # 只列舉前#個匹配項目
[root@localhost ~]# locate -c *.sh 2 [root@localhost ~]# locate *.sh /root/a.sh /root/a.sh.bak [root@localhost ~]# updatedb
2、find命令:實時查找工具,通過遍歷指定起始路徑下文件系統層級結構完成文件查找。
工作特性:查找速度略慢,精確查找,實時查找
用法:find [查找起始路徑] [查找條件] [執行動作]
起始路徑:默認當前目錄
條件:指定的查找標準,大小類型從屬關系等
動作:對符合條件的文件作出的操作,例如刪除等,默認為輸出至標準輸出,-print
-name “PATTERN”
-iname "PATTERN"
支持glob風格的通配符;
-regex PATTERN
基于正則表達式模式查找文件,匹配的是整個路徑,而非其名
-user NAME 查找屬主指定用戶的所有文件
-group NAME 查找屬組指定用戶的所有文件
-uid NUM 指定UID的所有文件
-gid NUM
-nouser 查找沒有屬主的用戶的所有文件
-nogroup 查找沒有屬組的用戶的所有文件
-type TYPE
f d l b c字符設備文件 p s
組合邏輯:
-a 與
-o 或
-not或!非
按文件大小查找
-size NUM
-NUM
+NUM
按時間查找:以天為單位:
-atime 訪問時間
# -# +#
-mtime -ctime
以分鐘為單位
-amin 訪問時間 -mmin 修改時間 -cmin改變時間
根據權限匹配
-perm /mode 任何一類用戶的權限中的任何一位符合條件即滿足
-mode 每一類用戶的權限中的每一位同時符合條件即滿足
mode 精確權限匹配
處理動作:
-print 輸出標準輸出,默認的動作
-ls 類似于對查找到的文件執行ls -l命令,輸出詳細信息
-delete 刪除查找到的文件
-fls /PATH/FILE 保存至指定路徑文件中
-ok COMMAND {}\; 對查找到的每個文件執行由COMMAND表示的命令,每次由用戶確認;
-exec COMMAND {}\; 對查找到的每個執行由COMMAND表示的命令,直接執行不需要確認。
find傳遞查找到的文件路徑至后面的命令時,是先查找出所有符合條件的文件路徑,并一次性傳遞給后面的命令,但是有些命令不能接受過長的參數,此時命令執行會失敗,另一種方式可以規避此問題:
xargs命令:xargs是一條unix和類unix操作系統的常用命令,他的作用是將參數列表轉換成小塊分段傳遞給其他命令,以避免參數該列表過長的問題。
find | xargs COMMAND
用xargs實現多參數的命令處理:xargs -i{} COMMAND
[root@localhost tmp]# find /testdir/shelltest/ -name m* | xargs -i{} cp {} ./ [root@localhost tmp]# ls mysh10.sh mysh13.sh mysh16.sh mysh19.sh mysh21.sh mysh4.sh mysh7.sh
避開某個目錄:-prune,例如:
find /etc -path ‘/etc/sane.d’ (-a) -prune -o -name "*.conf
-prune就像一個判斷語 句,當發現-prune前面的表達式math時,執行到-prune之后就會輸出一個1結果,如果shell的話,可以使用echo $?來看結果,如果-prune后面跟的是-o選項,用c語言的語法來講的話就是1 || -print,所以明顯可以看到當-prune前面的 表達式成立的話,就不會執行-o后面的內容了,如果不成立,即0 || -print,那么將打印輸出,另外需要注意的是-path路徑不能加入 結尾的/,比如路徑/vobs/gliethttp/signature,不能寫成/vobs/gliethttp/signature/如果find .那么后面-path的必須使用相對路徑./gliethttp除 find中.之外,其他所有查找,比如find tmp或者find /vobs等,-path都必須使用絕對路徑。
[root@localhost test]# ls ch.sh mysh13.sh.bak mysh17.sh.bak mysh20.sh.bak mysh4.sh.bak mysh8.sh.bak mysh10.sh.bak mysh14.sh.bak mysh18.sh.bak mysh21.sh.bak mysh5.sh.bak mysh9.sh.bak [root@localhost test]# cd .. [root@localhost tmp]# ls mysh10.sh mysh13.sh mysh16.sh mysh19.sh mysh21.sh mysh4.sh mysh7.sh test mysh11.sh mysh14.sh mysh17.sh mysh1.sh mysh2.sh mysh5.sh mysh8.sh
[root@localhost tmp]# find ./ -path ./test -prune -o -name "my*" ./mysh7.sh ./mysh14.sh ./mysh18.sh ./mysh20.sh
3、德摩根定律:
三、課后練習
1、查找/var目錄下屬主為root,且屬組為mail的所有文件
find /var -user root -group mail
2、查找/var目錄下不屬于root、lp的所有文件
find /var -not \( -user root -o -user lp \) -ls
3、查找/var目錄下最近一周內其內容被修改過,同時屬主不root也不是postfix
find /var/ -mtime -7 -not -user root -not -user postfix -ls
4、查找當前系統上沒有屬主或屬組,且最近一周內被訪問過的文件
find / -nouser -nogroup -atime -7
5、查找/etc目錄下大于1M且類型為普通文件的所有文件
find /etc/ -size +1M -type f
6、查找/etc目錄下所有用戶都沒有寫權限的文件
[root@localhost tmp]# find /etc/ -not -perm /222 -ls 50740639 196 -r--r--r-- 1 root root 198453 7月 19 04:57 /etc/pki/ca-trust/extracted/java/cace rts464249 352 -r--r--r-- 1 root root 359773 7月 19 04:57 /etc/pki/ca-trust/extracted/openssl/ca- bundle.trust.crt17127677 264 -r--r--r-- 1 root root 266702 7月 19 04:57 /etc/pki/ca-trust/extracted/pem/tls-c a-bundle.pem
7、查找/etc目錄下至少有一類用戶沒有執行權限的文件;至少一類用戶沒有,包含全沒有,或者任意一類用戶或者兩類用戶有,全都有取反
[root@localhost init.d]# find /etc/init.d/ -not -perm -111 -ls 34178284 4 -rw-r--r-- 1 root root 1160 11月 20 2015 /etc/init.d/README 34220229 16 -rw-r--r-- 1 root root 13948 9月 16 2015 /etc/init.d/functions
8、查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件。
[root@localhost init.d]# find /etc/init.d/ -perm -113 /etc/init.d/
原創文章,作者:SilencePavilion,如若轉載,請注明出處:http://www.www58058.com/34310