在平時的運維工作當中通常會編輯某些文件,但時間久了,突然一下子記不起文件的名字,遇到的事情又很緊急,需要立馬去處理,而自己只知道那個文件部分的特征信息,我們需要在系統中去搜索自己想要的文件,那么有沒有辦法去實現呢,當然有,在我們的系統中,文件查找的工具有兩個,locate和find。那么下面來介紹這兩個工具的用法以及兩個工具之間的差別。
在我們linux系統中文件查找分為:
實時查找:遍歷所有文件進行匹配,速度相對較慢
非實時查找:根據索引查找,通常是在數據庫中查找文件,查找速度快
※locate
locate屬于非實時查找,依賴于實現構建的索引,索引的創建時在系統空閑時由系統自動進行創建,通常是用周期性任務來完成的,手動更新數據庫使用updatedb命令,索引構建過程需要遍歷整個根文件系統,及其耗費資源。
工作特點:
查找速度快
模糊查找
非實時查詢
搜索的文件的全路徑,不僅僅是文件名
可能只搜索用戶具備讀取和執行權限的目錄
用法
locate [OPTION]… PATTERN…
locate的用法非常簡單,使用命令后面跟關鍵字,在locate后面跟所需要查找的關鍵字即可,沒有太大的難度,但依賴數據庫
選項:
-i:執行搜索時忽略大小寫的,在搜索的過程當中,有些文件可能是大寫的,但我也想把那個文件給找出來,這時候i選項就派上用場了
locate -i“root”
-n # :在搜索前加上此選項,搜索完成后,只列舉出前#個匹配的條目
-r:使用正則表達式來搜索
比如我搜索以sh結尾的文件
locate –r “\.sh$”
※find
實時查找工具,通過遍歷指定路徑完成文件查找
工作特點:
查找速度慢
精確查找
實時查找
可能只搜索用戶具備讀取執行的目錄
用法:相對于locate來說,find的用法相對于復雜一些
find [option] …[查找路徑] [查找條件] [處理動作]
查找路徑:指定具體目標路徑,默認為當前目錄
查找條件:指定的查找標準,可以是文件名,大小,類型,權限等標準進行,默認為找出路徑下的所有文件
處理動作:對符合條件的文件做操作,默認輸出至屏幕
查找條件
組合條件
與:-a
或:-o
非:-not,!
德摩根定律
非(A且B)=(非A)或(非B)
非(A或B)=(非A)且(非B)
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
根據文件名和inode查找
-name “文件名稱”:支持使用glob通配
*,?,[ ] , [^]
find /etc –name “.*?\.[^conf]查找以etc目錄下任意字符開頭以非.conf結尾的文件
-iname:不區分大小寫,跟locate用法相同
-inum n :按照inode號查找
find / -inum 393313 查找根文件系統下inode號為393313的文件
-samefile name :相同inode號的文件
find / -samefile profile 查找inode號相同的文件,也就是查找硬鏈接文件,硬鏈接文件的inode號是相同的。
-links n:根據鏈接數為n的文件來查找
find / -links 30 查找根文件系統中鏈接數為30的文件
-regex “pattern”以patter匹配真個文件路徑字符串,而不僅僅是文件名稱
根據屬主、屬組查找, 與-name, -iname最大的區別就在于 -regex是把find輸出的整個結果(有別于絕對路徑名)作為要匹配的對象, 而不僅僅是結果的最后一部分
find . -regex '.*/abc[^.]*'
-user username:查找屬主為指定用戶(UID)的文件,這個選項的作用在于,當我知道文件的屬主時,可以使用此選項來查找文件
find –user abc 查找文件系統中屬主為abc的文件
-group group:查找屬組為指定組(GID)的文件,當我知道文件屬組,可是用這個這個選項來查找文件
find -group vuser 查找系統中屬組為vuser的文件
-uid uid:查找屬主為指定的uid號的文件
find / -uid 503 查找系統中uid號為503的文件
-gid gid:查找屬組為指定的gid號的文件
find / -gid 500 查找系統中gid為500的文件
-nouser:查找文件沒有屬主的文件
find / -nouser
-nogroup:查找文件沒有屬組的文件
根據文件類型查找
-type TYPE
f:普通文件
d:目錄文件
-l:符號鏈接文件
s:套接字文件
b:塊設備文件
c:字符設備文件
p:管道文件
根據文件大小查找
-size [+|-]#unit
常用單位:k,M,G
#unit:(#-1,#)如2M
-#unit:[0,#-1],如 -2M
+#unit:(#,∞),如:+2M
2M表示文件大小大于1M小于2M
-2M:表示文件大小小于等于1M
+2M:表示文件大于2M
根據時間戳查找
以天為單位:
-atime[+|-]# 訪問時間
+#:表示查找訪問時間超過#+1天的文件
-#:表示查找訪問時間在#天之內的文件
#:表示查找訪問時間在#,,#≤x≤#+1天內的文件
-mtime:文件修改時間,用法同atime
-ctime:元數據發生改變的時間,用法同atime
2 表示文件訪問時間在大于等于2天小于3天之內的文件
-2:表示文件訪問時間在2天之內的文件,
+2:表示文件訪問時間超過3天的文件
根據權限查找
-perm [/|-]MODE
mode:精確權限匹配,如果我要查找文件的權限是644,那么我查找的條件寫的事644,那么查找出來的文件一定是 644權限的文件,查找的權限和匹配到文件的權限一致
-MODE:每一類對象都必須同時擁有指定權限,權限0表示不關注,遇到權限為零,那組用戶的權限不用關注
/MODE:任何一類用戶對象的權限中只要能一位匹配即可,
find –perm 755 匹配權限模式恰好是755的文件
find –perm /222 任意人有寫權限是都會匹配到
find –perm -002,只有當其他人有寫權限時,才會匹配到
644:查找文件權限位644的文件,權限完全一致才匹配
/644:只要有一類用戶的權限大于等于644即匹配
-644:必須三類用戶的權限大于等于644才匹配
處理動作
-print:默認的處理動作,顯示到屏幕
-ls:類似于對查到的文件執行’ls –l’命令
-delete:刪除查找到的文件,這個動作要慎用
-fls file:查找到的所有文件的長格式信息保存至指定文件中
-ok command {} \;對查找到的文件指定有command指定的命令,通常提示交互信息例如:
find -user hadoop -ok rm –rf { } \;查找文件屬主是hadoop的文件就刪除
-exec command {}\;對查找到的文件執行有command指定的命令,跟ok不同的是,執行命令是不用提示,直接執行命令
{ }:用于引用查找到的文件名稱自身
find傳遞查找到的文件至后面指定的命令時,查找到所有符合條件的文件一次性傳遞給后面的命令
有些命令不能接受過多的參數,執行的過程中會報錯,使用xargs就會避免錯誤的產生
find |xargs command 將find查找到的內容作為comand的參數這就是xargs命
的作用
示例:
find -name “*.conf” -exec cp {} /tmp/{}.org \;備份配置文件,添加.orig這個擴展名
find /tmp -ctime +3 -user joe -ok rm {} \;提示刪除存在時間超過3天以上且屬主是joe的文件
find ~ -perm -002 -exec chmod o-w {} \;在你的主目錄中查找其他人有寫權限的文件并將文件其他人的寫權限去掉
find /data –type f -perm 644 -name *.sh –exec chmod 755 {} \; 查找/data目錄下以.sh結尾的普通文件且權限位644的 文 件,之后將查找到的文件更改權限為755
find /home –type d -ls 查找出/home目錄下的所有目錄
locate和find的區別
命令 |
時效性 |
速度 |
精確性 |
搜索路徑 |
Locate |
非實時 |
快 |
不精確 |
全路徑搜索 |
Find |
實時 |
慢 |
精確 |
對有讀寫執行的目錄進行搜索 |
※壓縮工具
在系統當中如果我們有些文件不想刪除,又不經常用時,存在在磁盤上勢必會占用一定的磁盤空間,這時候我們可以將這些文件打包壓縮存在到某一個位置儲存,這樣一來,即保存了文件,也縮小了文件占用磁盤的空間,在linux系統當中有許多壓縮文件的工具,早期的有compress和uncompress,其對應的壓縮文件是以.Z結尾的壓縮格式的文件,現在使用較多的有:
gzip/gunzip以.gz結尾的壓縮格式的文件
bzip2/bunzip2以.bz2結尾的壓縮格式的文件
xz/unxz以.xz結尾的壓縮格式的文件
zip/unzip以.zip結尾的壓縮格式的文件
※compress
-d:解壓縮,相當于uncompress
-c:結果輸出至目標輸出,不刪除源文件
-v:顯示解壓縮的詳細過程信息
zcat file.Z>file
※gzip/gunzip
gzip [option]..filename
-d:解壓縮,相當于gunzip
-c:將壓縮或解壓縮的結果輸出至標準輸出
-#:指定壓縮比,值越大壓縮比越大,壓縮比取值范圍1-9
zcat:在不解壓文件的前提下,查看壓縮文件里面的內容
※bzip2/bunzip2
bzip2 [option]… file
-k:保留源文件,在壓縮的過程中,不刪除源文件
-d:解壓縮,相當于bunzip2
-#:1-9,壓縮比,默認為6
bzcat:不解壓文件的前提下,查看壓縮文件里面的內容
※xz/unxz
-k:保留源文件,在壓縮的過程中,不刪除源文件
-d:解壓縮,相當于bunzip2
-#:1-9,壓縮比,默認為6
xzcat:不解壓文件的前提下,查看壓縮文件里面的內容
※zip/unzip
打包壓縮
zip -r /etc/sysconfig sysconfig/
解壓縮
unzip sysconfig.zip
cat /var/log/messages |zip message – 查看文件顯示結果,通過管道輸入給zip作為參數
※tar
tar [option]
創建歸檔
tar -c –f /path/to/somefile.tar file..
tar cf /path/to/somefile.tar file..
查看歸檔文件中的文件列表
tar –tf /path/to/somefile.tar file..
展開文檔
tar xf /path/to/somefile.tar file..
tar xf /path/to/somefile.tar file.. –C -C解壓后文件存放的目錄
結合壓縮工具實現歸檔并壓縮
-j;bizp2
tar jcf etc.tar.bz2 /etc/
-z:gzip
tar zcf etc.tar.gz /etc/
-J:xz
tar Jcf etc.tar.xz /etc/
※cpio
復制 從或到文件
cpio命令是通過重定向的方式將文件進行打包備份,還原恢復的工具,它可以解壓以“.cpio”或者“.tar”結尾的文件。
cpio [選項] > 文件名或者設備名
cpio [選項] < 文件名或者設備名
選項
-o 將文件拷貝打包成文件或者將文件輸出到設備上
-i 解包,將打包文件解壓或將設備上的備份還原到系統
-t 預覽,查看文件內容或者輸出到設備上的文件內容
-v 顯示打包過程中的文件名稱。
-d 解包生成目錄,在cpio還原時,自動的建立目錄
-c 一種交心的存儲方式
示例:
將/etc/目錄備份
find /etc –print |cpio –ov > etc.cpio
查看內容
cpio –tv < etc.cpop
要解包文件
cpio –iv <etc.cpio
cpio –idv <etc.cpio
作業:
1、 查找/var目錄下屬主為root,且屬組為mail的所有文件
find /var/ -user root –group mail
2、 查找/var目錄下不屬于root、lp、gdm的所有文件
find /var/ -not \ ( -user root -o -user lp -o –user gdm \)
3、 查找/var目錄下最近一周內其內容修改過,同時屬主不為root,也不是postfix的文件
find –not \( –user root –o –user postfix\) –mtime -7
4、 查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件
find / \( -atime -7 -nouser –o –nogroup \) –ls
5、 查找/etc目錄下大于1M且類型為普通文件
find /etc/ -size +1M -ls
6、 查找/etc目錄下所有用戶都沒有寫權限的文件
任意一類用戶都有些權限,然后取反,最終的結果跟題目的意思想吻合,那只有使用-perm -mode,任何一類用戶的任何 一位權限匹配即可,只要有一類用戶的權限匹配到有寫權限,取反后,那么就沒有寫權限了,所以最終結果如下:
find /etc/ -not –perm /222
7、 查找/etc目錄下至少有一類用戶沒有執行權限的文件
至少有一類用戶沒有執行權限相反的意思是,所有的用戶的權限都有執行權限取反,也就是至少有一類用戶沒有執行權限
find /etc/ -perm -111
8、 查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件
find /etc/init.d/ -perm -111 -perm -002
find /etc/init.d/ -perm -113
原創文章,作者:fszxxxks,如若轉載,請注明出處:http://www.www58058.com/34696
文章整體思路清晰,內容豐滿有理有據,但是對find而言,這是筆試中的從常見考點,需要我們多加練習。