一、前言:在linux系統中,比較常用的查找命令有兩個,一個是locate,另外一個是find;locate命令運行時需要依靠後臺索引的數據庫,這個數據庫文件位於/var/cache/locate/locatedb.但是這個數據庫文件每天是通過cron自動更新的。假如你剛創建了一個文件,但是數據庫並沒有更新,那麼你用locate是無法找到的。當然,也可以執行updatedb來手動更新,那未免就有點麻煩了。優點就是通過數據庫查詢查找速度比較快;find命令是一個實時查找、可以對查找內容進行精確匹配,但是速度比較慢的查找命令。
二、命令介紹:
1、locate:
安裝locate:
yum –y install locate
更新locatedb數據庫
updatedb
使用:
locate shadow
從上圖的查找來看,locate查找速度很快,但是並不能精切的查找,所以用的多還是find命令。
2、find
用法: find [查找位置] [查找標準] [處理動作]
查找標準:
根據文件名進行查找:
-name “文件名稱”:根據文件名查找,支持字符匹配
[root@myb362 ~]# find / -name "shadow" /etc/shadow /tmp/etc/shadow-iname “文件名稱”:根據文件名查找,不區分字符大小寫
[root@myb362 ~]# find -iname "A.sh" ./A.Sh ./A.sh ./A.SH ./a.sh
根據文件屬性查找
-user UserName :根據屬主查找
[root@myb362 ~]# find . -user myb ./A.sh ./a.sh-group GroupName:根據屬組查找
[root@myb362 ~]# find . -group myb ./A.sh ./a.sh-uid UID:根據UID查找
[root@myb362 ~]# find -uid 2001 ./A.SH-gid GID:根據gid查找
[root@myb362 ~]# find / -gid 499 /var/lib/ntop /var/lib/ntop/rrd /var/lib/ntop/rrd/flows-nouser:查找沒屬主的文件
[root@myb362 ~]# find / -nouser /root/htop-1.0.2 /root/htop-1.0.2/SwapMeter.h /root/htop-1.0.2/ClockMeter.c-nogroup:查找沒有屬組的文件
[root@myb362 ~]# find /tmp -nogroup /tmp/test.txt /tmp/test.txt2
根據文件類型查找
-type
f:普通文件
d:目錄
b:塊設備
c:字符設備
l:符號鏈接
p:命名管道
s:套接字文件
根據文件大小查找
-size
常用單位:
k
M
G
例如:2M,包含1M到2M的所有文件
+2M,大於2M的文件
-2M,小於2M的文件
首先通過dd命令在一個空目錄下創建幾個文件
dd if=/dev/zero of=/find/a bs=512k count=1 這是創建一個512k的文件a,創建其他大小,只需要修改count的值即可,例如創建5M,count=10
[root@myb362 find]# du -sh * 512K a 2.0M abc 1.0M b 5.0M c 6.0M d 1.5M f查找大小爲2M的文件
[root@myb362 find]# find . -size 2M ./abc ./f查找大於2M的文件
[root@myb362 find]# find . -size +2M ./c ./d查找小於2M的文件
[root@myb362 find]# find . -size -2M . ./a ./b用數軸來表示時間和+、-之間的關係如下:
根據時間戳查找(使用方法與根據文件大小查找類似)
-atime:按訪問時間查找(以天爲單位)
-2:表示2天內被訪問過
+2:表示2天前被訪問過
2:表示正好2天前被訪問過
-mtime:以修改時間查找(以天爲單位)
-ctime:以改變時間查找(以天爲單位)
-amin:按訪問時間查找(以分鐘爲單位)
-mmin:以修改時間查找(以分鐘爲單位)
-cmin:以改變時間查找(以分鐘爲單位)
以數軸方式表達:
根據文件權限進行查找
-perm [+|-] MODE:權限匹配
沒有[+|-]:表示精確匹配權限
+MODE:任何一類用戶的任何一位權限匹配即可
-MODE:每類用戶的權限都匹配
剛開始有點蒙,慢慢理就會有頭緒了
要查找的文件權限如下
[root@myb362 find]# ls -al total 16392 drwxr-xr-x. 2 root root 4096 Apr 6 04:46 . dr-xr-x---. 9 root root 4096 Apr 6 04:20 .. -rwxr-xr-x. 1 root root 524288 Apr 6 04:21 a -rw-r--r--. 1 root root 2097152 Apr 6 04:21 abc -rw-r--r--. 1 root root 0 Apr 6 04:46 a.txt -rw-r--r--. 1 root root 1048576 Apr 6 04:21 b ---x--x--x. 1 root root 5242880 Apr 6 04:21 c -rw---x--x. 1 root root 6291456 Apr 6 04:21 d -rw-r--r--. 1 root root 1572864 Apr 6 04:26 f首先:查找文件權限類型爲755的文件
[root@myb362 find]# find . -perm 755 . ./a這裏可以看到是精確匹配權限,別忘了.是當前目錄,權限也是755
接着:查找有執行權限的文件
[root@myb362 find]# find . -perm +111 . ./a ./c ./d這裏可以看到,只要有任意一類用戶有執行權限就會列出這個文件
最後:查找所有用戶都有執行權限的文件
[root@myb362 find]# find . -perm -111 . ./a ./c好了,看到了吧。只有所有用戶都有執行權限的文件纔會被列出來
組合查找條件:
-a:與
-o:或
-not,!:非
例如:
1、查找文件小於2M並且所有用戶都有執行權的文件
[root@myb362 find]# find . -size +2M -a -perm -111 ./c2、查找/usr目錄下不屬於root,bin或者myb的文件
find /usr –not –user root –a –not –user bin –a –not myb或者
find /usr –not \(-user root –o –user bin –o –user myb\)
處理動作:
-print:顯示
-ls:顯示查找到的文件的詳細信息
-exec {} \;
解釋-exec {} 表示命令的參數即爲所找到的文件,以;表示command命令的結束。\是轉義符,因爲分號在命令中還有其他用途,所以就用一個\來限定表示這是一個分號而不是其他意思。
-ok {} \; :交互式的-exec,是一種比較安全的模式執行,每次都會給出提示,讓用戶選擇是否執行
例如:
1、查找剛纔那個目錄下的小於2M的文件並列出詳細信息
[root@myb362 find]# find . -size -2M -ls 656263 4 drwxr-xr-x 2 root root 4096 Apr 6 04:46 . 656265 512 -rwxr-xr-x 1 root root 524288 Apr 6 04:21 ./a 656270 0 -rw-r--r-- 1 root root 0 Apr 6 04:46 ./a.txt 656266 1024 -rw-r--r-- 1 root root 1048576 Apr 6 04:21 ./b2、接上題,這次將這些文件的權限改爲755然後列出詳細信息
[root@myb362 find]# find . -size -2M -exec chmod 755 {} \; -ls 656263 4 drwxr-xr-x 2 root root 4096 Apr 6 04:46 . 656265 512 -rwxr-xr-x 1 root root 524288 Apr 6 04:21 ./a 656270 0 -rwxr-xr-x 1 root root 0 Apr 6 04:46 ./a.txt 656266 1024 -rwxr-xr-x 1 root root 1048576 Apr 6 04:21 ./b其實,在find命令中,除了-exec 可以對符合條件的文件執行所給的linux命令,還有另外一個命令也可以實現這種功能,那就是xargs
xargs要結合管道來完成操作
用法:find [查找位置] [查找標準] |xargs command
上邊第二題用xargs處理就會是這樣
find . –size –2M | xargs chmod 755 | ls –l
但是,這次ls-l要放到後邊並且通過管道執行了。
-exec和xargs的區別
從上面的操作,我們發現exec和xargs都可以完成參數傳遞,那麼誰更好一些呢?
首先,我們看一下exec和xargs是如何傳遞參數的,還以上邊的目錄爲例
xargs
[root@myb362 find]# find . -type f |xargs echo ./abc ./a ./f ./c ./a.txt ./b ./dexec
[root@myb362 find]# find . -type f -exec echo {} \; ./abc ./a ./f ./c ./a.txt ./b ./d從輸出結果來看:
exec是對每個找到的文件執行一次命令,除非單個文件的文件名非常大,否則是不會出現命令行超長報錯的;
xargs是把所有的文件一起轉給命令,如果文件非常的多,那麼這些文件名組合成的命令行參數會非常長,很容易報錯。
另外:find|xargs在處理有空格字符的文件名時也會報錯,因爲這時執行的命令已經不知道哪些是分隔符,哪些是文件名中的空格了。但是exec不會出現這樣的問題。
exec與xargs對比:
1、exec每處理一個文件或者目錄,都需要啓動一次命令,效率比較低
2、exec 格式麻煩,不如xargs簡便
3、xargs不能操作文件名有空格的文件
4、xargs在文件比較多的時候容易報錯
綜上,如果要使用的命令支持一次處理多個文件,並且也知道這些文件裏沒有帶空格的文件,
那麼使用 xargs比較方便; 否則,就要用 exec了。
總結:find命令是非常好用的查找命令,但是這個命令也有很詭異的地方,讓人理解起來比較費解。總之,多用多練就會很熟悉的掌握它。