您好,登錄后才能下訂單哦!
概述:本篇主要講解locate命令和find命令,來幫助我們在linux中完成文件查找,方便我們快速定位文件。
一、文件查找
即在文件系統(tǒng)上查找符合條件的文件,常用工具有l(wèi)ocate和find
1、locate命令
locate命令其實是find -name的另一種寫法,但是要比后者快得多,原因在于它不搜索具體目錄,而是搜索查詢系統(tǒng)上預建的文件索引數(shù)據(jù)庫/var/lib/locatedb或者/var/lib/mlocate/mlocate.db,這個數(shù)據(jù)庫中含有本地所有文件信息。
注意:Linux系統(tǒng)自動創(chuàng)建這個數(shù)據(jù)庫,并且每天系統(tǒng)較為空閑時自動進行(周期性任務)更新一次,所以使用locate命令查不到最新變動過的文件。為了避免這種情況,可以在使用locate之前,先使用管理員手動更新數(shù)據(jù)庫(updatedb)手動更新數(shù)據(jù)庫。同時由于更新構(gòu)建索引數(shù)據(jù)庫過程需要遍歷整個根文件系統(tǒng)中的文件,極消耗資源,所以更新此數(shù)據(jù)庫最好在系統(tǒng)空閑時。
locate工作特點:
依賴于事先構(gòu)建的索引/var/lib/mlocate/mlocate.db
查找速度快(直接搜索數(shù)據(jù)庫)
模糊查找(非精確匹配,含有關鍵字即符合條件)
非實時查找(索引數(shù)據(jù)庫的構(gòu)建是非實時的,因此locate也不能實時查找)
搜索的是文件的全路徑,不僅僅是文件名(以文件的絕對路徑為搜索內(nèi)容,同時即使使用-b選項也只是基名位置含有關鍵字即可)
可能只搜索用戶具備讀取和執(zhí)行權限的目錄(用戶沒有對目錄讀與執(zhí)行權限就可能無法獲取該目錄下的文件列表信息,因而影響查找結(jié)果)
locate [選項]... 模式...
常用選項:
-A,--all 顯示與所有模式都匹配的條目而不是要求只有一個匹配
-b, --basename 匹配唯一的路徑名稱的基本文件名
-c, --count 只顯示找到條目的數(shù)量
-d, --database DBPATH 用DBPATH 替代默認的數(shù)據(jù)庫(/var/lib/mlocate/mlocate.db)
-i, --ignore-case 匹配模式時忽略大小寫區(qū)別
-r, --regexp REGEXP 搜索基本正則表達式 REGEXP 來代替模式
--regex 模式是擴展正則表達式
拓展選項:(了解)
-e, --existing 只顯示當前存在的文件條目
-L, --follow 當文件存在時跟隨蔓延的符號鏈接 (默認)
-l, --limit, -n LIMIT 限制為 LIMIT項目的輸出 (或 計數(shù))
-m, --mmap 忽略向后兼容性
-P, --nofollow, -H 當檢查文件時不跟隨蔓延的符號鏈接
-0, --null 輸出時以 NUL 分隔項目
-S, --statistics 不搜索項目,顯示有關每個已用數(shù)據(jù)庫的統(tǒng)計信息
-q, --quiet 不報告關于讀取數(shù)據(jù)庫的錯誤消息
-s, --stdio 忽略向后兼容性
-w, --wholename 匹配完整路徑名 (默認)
示例:
匹配唯一的路徑名稱的基本文件名(含有關鍵字即可)
[root@localhost ~]# locate -b passwd /etc/passwd /etc/passwd- /etc/pam.d/passwd /etc/security/opasswd ...
只顯示找到條目的數(shù)量
[root@localhost ~]# locate -c passwd 148
使用正則表達式
[root@localhost ~]# locate -r \.repo$ /etc/bash_completion.d/createrepo /etc/bash_completion.d/mergerepo /etc/bash_completion.d/modifyrepo /etc/yum.repos.d/CentOS-Base.repo
2、find命令
find命令用來在指定目錄下查找文件。任何位于參數(shù)之前的字符串都將被視為欲查找的目錄名。如果使用該命令時,不設置任何參數(shù),則find命令將在當前目錄下查找子目錄與文件。并且將查找到的子目錄和文件全部進行顯示。
find工作特點:
通過遍歷指定路徑下文件系統(tǒng)層級結(jié)構(gòu)完成文件查找(默認為當前目錄下查找包括子目錄內(nèi)的所有文件);
查找速度略慢(遍歷查找);
精確查找(搜索文件名與查找條件匹配);
實時查找(現(xiàn)用現(xiàn)找);
可能只搜索用戶具備讀取和執(zhí)行權限的目錄(用戶沒有對目錄讀與執(zhí)行權限就可能無法獲取該目錄下的文件列表信息,因而影響查找結(jié)果);
標準語法:find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
簡化語法:find [OPTION] [查找路徑] [查找條件表達式] [處理動作]
查找路徑:指定具體目標路徑;默認為當前目錄
查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認為找出指定路徑下的所有文件
處理動作:對符合條件的文件做操作,例如-ls 詳細顯示 -delete刪除等,默認輸出至標準輸出屏幕;
匹配測試:結(jié)果通常布爾型
根據(jù)文件名與inode查找:支持glob風格的通配符:*,?,[],[^]
-name "pattern"
-iname "pattern" :不區(qū)分字母大小寫
-inum n 按inode號查找
-samefile name 相同inode號的文件
-links n 鏈接數(shù)為n的文件
-regex pattern:基于正則表達式查找文件,匹配的是整個路徑,而非文件名;
根據(jù)文件從屬關系(屬主、屬組)查找:
-user USERNAME:查找屬主為指定用戶(UID)的所有文件
-group GRPNAME: 查找屬組為指定組(GID)的所有文件
-uid UserID:查找屬主為指定的UID號的所有文件
-gid GroupID:查找屬組為指定的GID號的所有文件
-nouser:查找沒有屬主的文件
-nogroup:查找沒有屬組的文件
根據(jù)文件的類型查找:
-type TYPE:
f: 普通文件
d: 目錄文件
l: 符號鏈接文件
s:套接字文件
b: 塊設備文件
c: 字符設備文件
p: 管道文件
組合條件:
與: -a,默認組合邏輯
或: -o
非: -not, !
德·摩根定律:在命題邏輯中存在著下面這些關系:
(非 P) 或 (非 Q) = 非(P 且 Q)
(非 P) 且 (非 Q) = 非(P 或 Q)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
根據(jù)文件大小來查找:
-size [+|-]#UNIT
常用單位: k, M, G
#UNIT: (#-1, #]
如: 10k 表示(9k,10k]
-#UNIT: [0,#-1]
如: -10k 表示[0,9k]
+#UNIT: (#,∞)
如: +10k 表示(10k,∞)
根據(jù)時間戳查找:
以“天”為單位;
-atime [+|-]#,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
以“分鐘”為單位:
-amin
-mmin
-cmin
根據(jù)權限查找:
-perm [/|-]MODE
MODE: 精確權限匹配
/MODE:任何一類用戶(u,g,o)對象的權限中任意一位(r,w,x)匹配即可;
9位權限之間存在“或”關系;
+MODE形式 從centos7開始淘汰
-MODE:每一類用戶(u,g,o)的權限中的每一位(r,w,x)都必須同時擁有指定權限;
9位權限之間存在“與”關系;
0 表示不關注
eg:/002 -002 而且兩者效果一樣
舉例:
find -perm 755 會匹配權限模式恰好是755的文件
只要當任意人有寫權限時, find -perm +222就會匹配
只有當每個人都有寫權限時, find -perm -222才會匹配
只有當其它人( other)有寫權限時, find -perm -002才會匹配
處理動作
-print:默認的處理動作,顯示至屏幕;
-ls:類似于對查找到的文件執(zhí)行“ ls -l”命令
-delete:刪除查找到的文件;
-fls file:查找到的所有文件的長格式信息保存至指定文件中
-ok COMMAND {} \; 對查找到的每個文件執(zhí)行由COMMAND指定的命令;(固定格式)
對于每個文件執(zhí)行命令之前,都會交互式要求用戶確認
eg:
[root@localhost ~]# find /etc -nouser -nogroup -ls 6594 0 -rwxr-xrwx 1 1006 1006 0 8月 20 15:13 /etc/rc.d/init.d/test [root@localhost ~]# find /etc -nouser -nogroup -ok chown root:root {} \; < chown ... /etc/rc.d/init.d/test > ? y
-exec COMMAND {} \; 對查找到的每個文件執(zhí)行由COMMAND指定的命令(固定格式)
eg:
[root@localhost init.d]# find ./ -perm -656 ./test [root@localhost init.d]# find ./ -perm -656 -exec mv {} {}.danger \; [root@localhost init.d]# ll 總用量 92 -rw-r--r--. 1 root root 13948 9月 16 2015 functions -rwxr-xr-x. 1 root root 2989 9月 16 2015 netconsole -rwxr-xr-x. 1 root root 6630 9月 16 2015 network -rw-r--r--. 1 root root 1160 11月 20 2015 README -rwxr-xrwx. 1 root root 0 8月 20 15:13 test.danger -rwxr-xr-x. 1 root root 44264 7月 25 22:00 vmware-tools -rwxr-xr-x. 1 root root 15721 7月 25 22:00 vmware-tools-thinprint
{}: 用于引用查找到的文件名稱自身
find傳遞查找到的文件至后面指定的命令時,查找到所有符合
條件的文件一次性傳遞給后面的命令
有些命令不能接受過多參數(shù),此時命令執(zhí)行可能會失敗,下面方式可規(guī)避此問題
find | xargs COMMAND
意為:find 命令查找結(jié)果以管道 | 傳給后接的 xargs命令 再接接受find標準輸出的命令
xargs:建立和執(zhí)行來自標準輸入的命令行
xargs命令是給其他命令傳遞參數(shù)的一個過濾器,也是組合多個命令的一個工具。它擅長將標準輸入數(shù)據(jù)轉(zhuǎn)換成命令行參數(shù),xargs能夠處理管道或者stdin并將其轉(zhuǎn)換成特定命令的命令參數(shù)。xargs也可以將單行或多行文本輸入轉(zhuǎn)換為其他格式,例如多行變單行,單行變多行。xargs的默認命令是echo,空格是默認定界符。這意味著通過管道傳遞給xargs的輸入將會包含換行和空白,不過通過xargs的處理,換行和空白將被空格取代。xargs是構(gòu)建單行命令的重要組件之一。
主要參數(shù)
-i 用 {} 代替 傳遞的數(shù)據(jù)
-I string 用string來代替?zhèn)鬟f的數(shù)據(jù)-n[數(shù)字] 設置每次傳遞幾行數(shù)據(jù)
-n 選項限制單個命令行的參數(shù)個數(shù)
-t 顯示執(zhí)行詳情
-p 交互模式
-P n 允許的最大線程數(shù)量為n
-s[大小] 設置傳遞參數(shù)的最大字節(jié)數(shù)(小于131072字節(jié))
-x 大于 -s 設置的最大長度結(jié)束 xargs命令執(zhí)行
xargs命令用法
xargs用作替換工具,讀取輸入數(shù)據(jù)重新格式化后輸出。
定義一個測試文件,內(nèi)有多行文本數(shù)據(jù):
cat test.txt a b c d e f g h i j k l m n o p q r s t u v w x y z
多行輸入單行輸出:
cat test.txt | xargs a b c d e f g h i j k l m n o p q r s t u v w x y z
-n選項多行輸出:
cat test.txt | xargs -n3 a b c d e f g h i j k l m n o p q r s t u v w x y z
-d選項可以自定義一個定界符:
echo "nameXnameXnameXname" | xargs -dX
name name name name
結(jié)合-n選項使用:
echo "nameXnameXnameXname" | xargs -dX -n2
name name
name name
讀取stdin,將格式化后的參數(shù)傳遞給命令
假設一個命令為 sk.sh 和一個保存參數(shù)的文件arg.txt:
#!/bin/bash #sk.sh命令內(nèi)容,打印出所有參數(shù)。 echo $* arg.txt文件內(nèi)容: cat arg.txt aaa bbb ccc
xargs的一個選項-I,使用-I指定一個替換字符串{},這個字符串在xargs擴展時會被替換掉,當-I與xargs結(jié)合使用,每一個參數(shù)命令都會被執(zhí)行一次:
cat arg.txt | xargs -I {} ./sk.sh -p {} -l -p aaa -l -p bbb -l -p ccc -l
復制所有圖片文件到 /data/p_w_picpaths 目錄下:
ls *.jpg | xargs -n1 -I cp {} /data/p_w_picpaths
xargs結(jié)合find使用
用rm 刪除太多的文件時候,可能得到一個錯誤信息:/bin/rm Argument list too long. 用xargs去避免這個問題:
find . -type f -name "*.log" -print0 | xargs -0 rm -f
xargs -0將\0作為定界符。
統(tǒng)計一個源代碼目錄中所有php文件的行數(shù):
find . -type f -name "*.php" -print0 | xargs -0 wc -l
查找所有的jpg 文件,并且壓縮它們:
find . -type f -name "*.jpg" -print | xargs tar -czvf p_w_picpaths.tar.gz xargs
其他應用 假如你有一個文件包含了很多你希望下載的URL,你能夠使用xargs下載所有鏈接:
cat url-list.txt | xargs wget -c
子Shell(Subshells) 運行一個shell腳本時會啟動另一個命令解釋器.,就好像你的命令是在命令行提示下被解釋的一樣,類似于批處理文件里的一系列命令。每個shell腳本有效地運行在父shell(parent shell)的一個子進程里。這個父shell是指在一個控制終端或在一個xterm窗口中給你命令指示符的進程。
cmd1 | ( cmd2; cmd3; cmd4 ) | cmd5
如果cmd2 是cd /,那么就會改變子Shell的工作目錄,這種改變只是局限于子shell內(nèi)部,cmd5則完全不知道工作目錄發(fā)生的變化。
子shell是嵌在圓括號()內(nèi)部的命令序列,子Shell內(nèi)部定義的變量為局部變量。 子shell可用于為一組命令設定臨時的環(huán)境變量:
COMMAND1
COMMAND2
COMMAND3
(
IFS=:
PATH=/bin
unset TERMINFO
set -C
shift 5
COMMAND4
COMMAND5
exit 3 # 只是從子shell退出。
)
# 父shell不受影響,變量值沒有更改。
COMMAND6
COMMAND7
練習示例:
精確查找對應文件名文件
[root@localhost ~]# find /etc -name "passwd" /etc/passwd /etc/pam.d/passwd
根據(jù)文件或者正則表達式進行匹配
列出當前目錄及子目錄下所有文件和文件夾
find .
在/home目錄下查找以.txt結(jié)尾的文件名
find /home -name "*.txt"
同上,但忽略大小寫
find /home -iname "*.txt"
當前目錄及子目錄下查找所有以.txt和.pdf結(jié)尾的文件
find . \( -name "*.txt" -o -name "*.pdf" \) 或 find . -name "*.txt" -o -name "*.pdf"
匹配文件路徑或者文件
find /usr/ -path "*local*"
基于正則表達式匹配文件路徑
find . -regex ".*\(\.txt\|\.pdf\)$"
同上,但忽略大小寫
find . -iregex ".*\(\.txt\|\.pdf\)$"
否定參數(shù) 找出/home下不是以.txt結(jié)尾的文件
find /home ! -name "*.txt"
根據(jù)文件類型進行搜索
find . -type 類型參數(shù)
類型參數(shù)列表:
f 普通文件
l 符號連接
d 目錄
c 字符設備
b 塊設備
s 套接字
p FIFO
基于目錄深度搜索 向下最大深度限制為3
find . -maxdepth 3 -type f
搜索出深度距離當前目錄至少2個子目錄的所有文件
find . -mindepth 2 -type f
根據(jù)文件時間戳進行搜索
find . -type f 時間戳
UNIX/Linux文件系統(tǒng)每個文件都有三種時間戳:
訪問時間(-atime/天,-amin/分鐘):用戶最近一次訪問時間。
修改時間(-mtime/天,-mmin/分鐘):文件最后一次修改時間。
變化時間(-ctime/天,-cmin/分鐘):文件數(shù)據(jù)元(例如權限等)最后一次修改時間。
搜索最近七天內(nèi)被訪問過的所有文件
find . -type f -atime -7
搜索恰好在七天前被訪問過的所有文件
find . -type f -atime 7
搜索超過七天內(nèi)被訪問過的所有文件
find . -type f -atime +7
搜索訪問時間超過10分鐘的所有文件
find . -type f -amin +10
找出比file.log修改時間更長的所有文件
find . -type f -newer file.log
根據(jù)文件大小進行匹配
find . -type f -size 文件大小單元
文件大小單元:
b —— 塊(512字節(jié))
c —— 字節(jié)
w —— 字(2字節(jié))
k —— 千字節(jié)
M —— 兆字節(jié)
G —— 吉字節(jié)
搜索大于10KB的文件
find . -type f -size +10k
搜索小于10KB的文件
find . -type f -size -10k
搜索等于10KB的文件
find . -type f -size 10k
刪除匹配文件
刪除當前目錄下所有.txt文件
find . -type f -name "*.txt" -delete
根據(jù)文件權限/所有權進行匹配 當前目錄下搜索出權限為777的文件
find . -type f -perm 777
找出當前目錄下權限不是644的php文件
find . -type f -name "*.php" ! -perm 644
找出當前目錄用戶tom擁有的所有文件
find . -type f -user tom
找出當前目錄用戶組sunk擁有的所有文件
find . -type f -group sunk
借助-exec選項與其他命令結(jié)合使用 找出當前目錄下所有root的文件,并把所有權更改為用戶tom
find .-type f -user root -exec chown tom {} \;
上例中,{} 用于與-exec選項結(jié)合使用來匹配所有文件,然后會被替換為相應的文件名。
找出自己家目錄下所有的.txt文件并刪除
find $HOME/. -name "*.txt" -ok rm {} \;
上例中,-ok和-exec行為一樣,不過它會給出提示,是否執(zhí)行相應的操作。
查找當前目錄下所有.txt文件并把他們拼接起來寫入到all.txt文件中
find . -type f -name "*.txt" -exec cat {} \;> all.txt
將30天前的.log文件移動到old目錄中
find . -type f -mtime +30 -name "*.log" -exec cp {} old \;
找出當前目錄下所有.txt文件并以“File:文件名”的形式打印出來
find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;
因為單行命令中-exec參數(shù)中無法使用多個命令,以下方法可以實現(xiàn)在-exec之后接受多條命令 -exec ./text.sh {} \; 搜索但跳出指定的目錄 查找當前目錄或者子目錄下所有.txt文件,但是跳過子目錄sk
find . -path "./sk" -prune -o -name "*.txt" -print
find其他技巧收集
要列出所有長度為零的文件
find . -empty
二、作業(yè)練習:
1、查找/var目錄下屬主為root,且屬組為mail的所有文件
[root@localhost ~]# find /var -user root -group mail /var/spool/mail /var/spool/mail/root
2、查找/var目錄下不屬于root、lp、gdm的所有文件
find /var -not \( -user root -o -user lp -o -user gdm \)
3、查找/var目錄下最近一周內(nèi)其內(nèi)容修改過,同時屬主不為root,也不是postfix的文件
find /var -mtime -7 -not \( -user root -a -user postfi \)
4、查找當前系統(tǒng)上沒有屬主或?qū)俳M,且最近一個周內(nèi)曾被訪問過的文件
find / -atime -7 -not \( -nouser -a -nogroup \)
5、查找/etc目錄下大于1M且類型為普通文件的所有文件
find /etc \( -size +1M -type f \) -ls
6、查找/etc目錄下所有用戶都沒有寫權限的文件
find /etc -not -perm /222 -ls
7、查找/etc目錄下至少有一類用戶沒有執(zhí)行權限的文件
find /etc -not -perm -111 -ls
8、查找/etc/init.d目錄下,所有用戶都有執(zhí)行權限,且其它用戶有寫權限的文件
find /etc/init.d/ -perm -111 -perm /002 -ls
9、查找/tmp目錄下屬主為非root的所有文件;
[root@localhost ~]# find /tmp ! -user root [root@localhost ~]# find /tmp -not -user root
10、查找/tmp目錄下文件名中不包含fstab字符串的文件;
[root@localhost ~]# find /tmp ! -iname "*fstab*" [root@localhost ~]# find /tmp -not -iname "*fstab*"
11、查找/tmp目錄下屬主為非root,而且文件名中不包含fstab字符串的文件;
find /tmp ! -user root ! -iname "*fstab*" find /tmp ! -user root -a ! -iname "*fstab*" find /tmp -not -user root -a -not -iname "*fstab*" find /tmp ! \( -user root -o -not -iname \) "*fstab*" find /tmp -not \( -user root -o -not -iname \) "*fstab*"
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。