1、 locate命令(非實時查找即數據庫查找)
1)、查詢系統上預建的文件索引數據庫/var/lib/mlocate/mlocate.db
依賴于事先構建的索引;索引的構建是在系統較為空閑時自動進行( 周期性任務) 或者管理員手動更新數據庫即是執行#updatedb命令;引構建過程需要遍歷整個根文件系統,極消耗資源;
工作特點:查找速度快、模糊查找、非實時查找、搜索的是文件的全路徑-不僅僅是文件名、可能只搜索用戶具備讀取和執行權限的目錄
2)、locate KEYWORD
有用的選項
? -i 執行不區分大小寫的搜索
? -n X 只列舉前X 個匹配項目
#locate foo
? 搜索名稱或路徑中帶有“foo ”的文件
#locate -r ‘\.foo$’
? 使用Regex來搜索以“.foo”結尾的文件
2、find命令(實時查找,通過遍歷指定路徑完成文件查找)
1)、工作特點:查找速度略慢、精確查找、實時查找、可能只搜索用戶具備讀取和執行權限的目錄
2)、find [OPTION]… [ 查找路徑] [ 查找條件] [ 處理動作]
(查找的是符合指定條件的查找路徑各目錄層級下的文件)
查找路徑:指定具體目標路徑,也即是查找范圍,默認為當前目錄
查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行,默認為找出指定路徑下的所有文件
處理動作:對符合條件的文件作出操作,默認輸出至屏幕
3)、查找條件
①、根據文件名和inode(#ll -i命令可以查看文件的inode) 查找:
-name " 文件名稱" :支持使用glob通配符*, ?, [], [^]等等
例如#find / -name *checkint*
-iname " 文件名稱" :不區分字母大小寫
-inum n :按inode號查找
-samefile name :相同inode號的文件
-links n :鏈接數為n的文件
-regex "PATTERN" :以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名稱
例如#find /root/bin –regex “.*\.sh$”
②、根據屬主、屬組查找:
-user USERNAME :查找屬主為指定用戶(UID)的文件
-group GRPNAME : 查找屬組為指定組(GID)的文件
-uid UserID :查找屬主為指定的UID號的文件
-gid GroupID :查找屬組為指定的GID號的文件
-nouser :查找沒有屬主的文件
-nogroup :查找沒有屬組的文件
③、根據文件類型查找:
-type TYPE
f: 普通文件
d: 目錄文件
l: 符號鏈接文件
s:套接字文件
b: 塊設備文件
c: 字符設備文件
p: 管道文件
④、根據文件大小來查找:
-size [+|-]#UNIT
常用單位:k, M, G
#UNIT: (#-1, #] ,如:6k
-#UNIT :[0,#-1], 如:-6k
+#UNIT :(#, ∞ ), 如:+6k
⑤、根據時間戳:
以“天”為單位;
-atime [+|-]#,
#: [#,#+1)
+#: [#+1, ∞ ]
-#: [0,#)
-mtime
-ctime
以“分鐘”為單位:
-amin
-mmin
-cmin
⑥、根據權限查找:
-perm [/|-]MODE
MODE: 精確權限匹配
/MODE:任何一類(u,g,o) 對象權限中只要能一位匹配即可,或關系,以前使用的+從centos7開始淘汰
-MODE :每一類對象都必須同時擁有指定權限,與關系
0表示不關注
? find -perm 755 會匹配權限模式恰好是755 的文件
? 只要當任意人有寫權限時,find -perm /222 就會匹配
? 只有當每個人都有寫權限時,find -perm -222 才會匹配
? 只有當其它人(other )有寫權限時,find -perm -002才會匹配,不關注屬主和屬組是否具有寫權限
4)、組合條件
與:-a
或:-o
非:-not, !
德·摩根 定律:
非(P 且 Q) = (非 P) 或 (非 Q)
非(P 或 Q) = (非 P) 且 (非 Q)
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
示例:
找出/tmp 目錄下,屬主不是root ,且文件名不是fstab 的文件
#find /tmp \( -not -user root -a -not -name 'fstab' \) -ls
#find /tmp -not \( -user root -o -name 'fstab' \) –ls
小括號要進行轉義
排除目錄(查找路徑/etc,如果是/etc/sane.d目錄下的全部剪除,否則查找查找 .conf結尾的文件)
# find /etc -path "/etc/sane.d" -a -prune -o -name "*.conf" -print
5)、處理動作
-print:默認的處理動作,顯示至屏幕;
-ls:類似于對查找到的文件執行“ls -l” 命令
-delete:刪除查找到的文件;
-fls file:查找到的所有文件的長格式信息保存至指定文件中
例如[root@centos7 ~]# find -name data -fls fi
-ok COMMAND {} \;對查找到的每個文件執行由COMMAND 指定的命令,但是對于每個文件執行命令之前,都會交互式要求用戶確認
-exec COMMAND {} \;對查找到的每個文件執行由COMMAND 指定的命令
{}:上面的大括號用于引用查找到的文件名稱自身
find 傳遞查找到的文件至后面指定的命令時,查找到所有符合條件的文件一次性傳遞給后面的命令,有些命令不能接受過多參數,此時命令執行可能會失敗,下面方式可規避此問題
find | xargs COMMAND
示例如下:
#find -name “*.conf” -exec cp {} {}.orig \;
? 備份查找到的符合要求的所有配置文件,添加.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 {} \;
# #find / -nouser -o –nogroup –atime -7 | xargs chmod o+x
6)、壓縮、解壓縮及歸檔工具
①、compress [-dfvcVr] [-b maxbits] [file …]
#compress file ,把file壓縮為file.Z,同時原file不再存在
-d: 解壓縮,相當于uncompress,原文件不再存在
例如#compress -d file.Z ,把file.Z解壓縮為file,同時file.Z不再存在
-c: 結果輸出至標準輸出即是屏幕, 不刪除原文件
例如#compress -c file > file.Z
-v: 顯示詳情
uncompress 解壓縮
zcat file.Z >file
其中#zcat file.Z 直接打印于屏幕
# zcat file.Z >file把file.Z定向解壓為file,同時不刪除file.Z原文件
②、gzip [OPTION]… FILE …
-d: 解壓縮,相當于gunzip,原文件不再存在
例如[root@centos7 testdir]# gzip fstab messages,結果是fstab.gz、messages.gz
[root@centos7 testdir]# gzip fstab.gz、messages.gz,結果是fstab messages
-c: 將壓縮或解壓縮的結果輸出至標準輸出,不刪除原文件
-#:1-9 ,指定壓縮比,值越大壓縮比越大
zcat :不顯式解壓縮的前提下查看文本文件內容
實例:
gzip -c messages > messages.gz
gzip -c -d messages.gz > messages
zcat messages.gz > messages
③、bzip2 [OPTION]… FILE …
-k: keep,保留原文件
-d:解壓縮
-#:1-9,壓縮比,默認為6
bzcat:不顯式解壓縮的前提下查看文本文件內容
例如#bzcat messages.bz2 > messages 如果不重定向,則會打印于屏幕上
④、xz [OPTION]… FILE …
-k: keep,保留原文件
-d :解壓縮
-# :1-9,壓縮比,默認為6
xzcat: 不顯式解壓縮的前提下查看文本文件內容
⑤、zip/unzip
打包壓縮
#zip -r sysconfig.zip sysconfig/,即是把sysconfig/打包壓縮為sysconfig.zip
#zip messages會提示錯誤,因為zip不能直接壓縮單個文件
解包解壓縮
#unzip sysconfig.zip
#cat /var/log/messages | zip message –
#cat /var/log/messages | zip message.zip –,用于壓縮單個文件,生成壓縮文件message.zip
#unzip -p message > message,重定向輸出到message,否則不顯式解壓縮的前提下查看文本文件內容
練習題:
1 、查找/var 目錄下屬主為root ,且屬組為mail 的所有文件
#find /var –user root -group mail -ls
2 、查找/var 目錄下不屬于root 、lp 、gdm 的所有文件
#find /var ! \(-user root -o -user lp -o -user gdm\) -ls
#find /var ! -user root !-user lp ! -user gdm -ls
其中第一條命令中括號要進行轉義
3 、查找/var 目錄下最近一周內其內容修改過,同時屬主不為root ,也不是postfix 的文件
#find /var mtime -7 ! -user root ! -user postfix –ls
4 、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件
#find / -nouser -o –nogroup –atime -7 | xargs ls –ld
#find / \(-atime -7 -nouser -o -nogroup\) –ls
#find / -atime -7 -nouser -o -nogroup -ls 缺少括號不能達到題目要求
5 、查找/etc 目錄下大于1M 且類型為普通文件的所有文件
#find /etc -size +1M –type f –ls
#find /etc -size +1M -size -10M –type f -ls
6 、查找/etc 目錄下所有用戶都沒有寫權限的文件
#find /etc !-perm /222 –ls
7 、查找/etc 目錄下至少有一類用戶沒有執行權限的文件
#find /etc ! -perm -111 -ls
8 、查找/etc/init.d 目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件
#find /etc/init.d/ -perm -113 –ls
因為/etc/init.d是鏈接目錄,所以命令中要寫成/etc/init.d/的形式
原創文章,作者:18612763863,如若轉載,請注明出處:http://www.www58058.com/35858