文件查找 小編在學這堂課的前一天夜裡打嗝打了半宿,第二天上課的時候迷迷糊糊,所以,導致文件查找這章我放了好久的鴿子。 這裡是回看視頻摘出來的筆記。如有理解有偏差,請留言。 本篇只有3個命令,重點是find,時間有限的朋友可以只看find命令。這太過重要了。 whereis命令 在一些特定的目錄搜索, ...
文件查找
小編在學這堂課的前一天夜裡打嗝打了半宿,第二天上課的時候迷迷糊糊,所以,導致文件查找這章我放了好久的鴿子。
這裡是回看視頻摘出來的筆記。如有理解有偏差,請留言。
本篇只有3個命令,重點是find,時間有限的朋友可以只看find命令。這太過重要了。
whereis命令
在一些特定的目錄搜索,搜索二進位文件、幫助文件、源文件等
選項:
不加任何選項就會列出所有文件。
-b 只搜索二進位文件
-m 只搜索幫助文件
-s 只搜索源文件
-l 列出whereis搜索的路徑,也就是whereis會在這些路徑下搜索內容
-u 不是上述三類文件的其它類型文件。
locate命令
用來快速搜索文件的工具,是根據索引資料庫搜索的。數據路位置/var/lib/mlocate/mlocate.db
1、新系統可能沒有這個資料庫,updatedb命令可以手工更新資料庫
2、updatedb這個命令會消耗大量的IO 需要在系統不繁忙的時候更新
3、updatedb命令會根據/etc/updatedb.conf的設定取搜索硬碟內的文件名,並保存在/var/lib/mlocate目錄下的資料庫內。
locate命令 主要用來搜索靜態文件
-i 不區分大小寫搜索
-r 使用基本正則表達式
-b 只搜索文件名,而不搜索全路徑。預設是搜索全路徑
-c 計數
-n # 只顯示前幾個搜索結果
-S 顯示locate資料庫信息
備註:
locate不能指定文件搜索路徑,要想指定搜索路徑需要手工使用正則表達式指定,祥看示例
locate不是實時搜索,而且是模糊搜索
locate預設會搜索文件的全路徑,不僅僅是文件名,意思是如果目錄包含某個關鍵詞,目錄下的所有文件都會被搜索到
locate只會搜索當前用戶能訪問到的目錄,意思是如果某個用戶對某個目錄沒有訪問許可權,該目錄就不會被搜索
示例說明:指定搜索路徑{
[root@CentOS7 scripts]#locate -r "^/data/scripts/.*\.sh"
/data/scripts/FOOT.sh
/data/scripts/adddescrption.sh
/data/scripts/arg.sh
/data/scripts/arg2.sh
/data/scripts/argsnum.sh
/data/scripts/backup_etc.sh
/data/scripts/bim.sh
/data/scripts/checkdisk.sh
/data/scripts/checkint.sh
/data/scripts/createuser.sh
/data/scripts/df_warning.sh}
find命令
實時查找,精確查找,查找條件豐富,只搜索具有許可權的目錄
find [OPTIONS] [查找路徑] [查找條件] [處理動作]
預設是遞歸搜索,預設是搜索當前目錄
選項:
-maxdepth # 最大搜索深度,指定搜索目錄下搜索到第幾級
-mindepth # 最小搜索深度,
-depth或-d 一般是先搜索文件夾,再去搜索文件夾內的文件。如果加上該選項-d,就會先搜索文件,在搜索目錄
查找條件:
根據文件名搜索
-name 文件名 根據文件名搜索,精確匹配而不是模糊搜索。支持通配符
如果想要模糊搜索,可以使用 "*文件名*" 建議在使用通配符的時候要加上雙引號,要不會產生各種莫名奇妙的問題
-iname 文件名 不區分大小寫搜索
-inum INODE 根據INODE節點號搜索,可以用來搜索硬鏈接
-samefile 文 件名 搜索相同節點編號的文件,需要註意的是,需要搜索同一分區內的相同節點編號
-links # 根據鏈接數為#這個條件進行搜索
-regex "PATTERN" 以PATTERN匹配整個文件路徑,而非文件名稱
根據屬性信息搜索
-user 用戶名 根據所有者搜索
-group 組名 根據所屬組搜索
-nouser 用戶名 搜索沒有所有者的文件
-nogroup 組名 搜索沒有所屬組的文件
-uid UID 根據UID查找
-gid GID 根據GID查找
根據文件類型搜索
-type TYPE 根據文件類型搜索
TYPE:
d 查找文件類型為目錄的所有文件
f 查找文件類型為普通文件的所有文件
p 查找文件類型為管道文件的所有文件
s 查找文件類型為套接字的所有文件
c 查找文件類型為字元設備的所有文件
b 查找文件類型為塊設備的所有文件
l 查找文件類型為軟連接的所有文件
搜索空文件或目錄
-empty 搜索空文件或者文件夾
組合條件
-a 與 預設就是按照並且條件搜索多個條件
-o 或
-not|! 非
因為與的優先順序高於或的優先順序,可以使用()擴起或的選項以提高或的優先順序,()需要轉義寫成\( \)
德*摩根定律:
(非A)或(非B)=非(A且B)
(非A)且(非B)=非(A或B)
排除特定目錄搜索
-path 排除文件夾路徑 -a -prune -o -name 文件名 指定不搜那些文件夾
例:
find / \( -path "/sys" -o -path "/proc"\) -a -prune -o -name "*.conf"
# 搜索除/proc和/sys目錄以外的所有路徑下的以.conf結尾的文件
find / \( -path "/sys" -o -path "/proc" \) -a -prune -o -name "*.conf"
根據文件大小搜索
-size [+|-] #UNIT
常用單位k M G c(byte) 註意大小寫
6k 表示 (5k,6k],包括6K不包括5K
-6k 表示 [0k,6-1k],包括0k也包括5k,兩個之間
+6k 表示(6K,oo),不包含6k
-size 1024k和-size 1M的區別
-size 1024k 會搜索到1023k到1024k之間的文件
-size 1M 會搜索到0到1M之間的文件
根據時間戳查找
-atime [+|-]#
+10 表示11天以前的文件
-1 表示最近一天內的文件
10 表示10天到11天內,
-mtime [+|-]#
-ctime [+|-]#
-mmin [+|-]# 表示按分鐘搜索
-amin [+|-]#
-cmin [+|-]#
根據許可權搜索
-perm [/|-] MODE
MODE:精確許可權匹配
/MODE 任何一類(u g o)對象的任何一位許可權(r w x)中,只要能匹配一位許可權就能搜索到,是或的關係
-MODE 表示任何一類(u g o)對象的許可權中r w x三者都完滿條件才匹配,是並且的關係
如果MODE中三類對象中有一位是0,表示對應該類對象無論有沒有許可權無所謂
備註,在centos7後,+的寫法開始淘汰,使用/代替了
find -perm 755 會精確搜索許可權是755的文件
find -perm /222 只要任何一類用戶有寫許可權就會匹配。或者說,至少有一類用戶有寫許可權就會匹配
find -perm /111 只要任何一類用戶有寫許可權的就會匹配。或者說,至少有一類用戶有執行許可權就會匹配
find -perm /666 只要任何一類用戶有讀或者有寫許可權就會匹配。
find -perm /001 其他用戶有執行許可權的文件才會匹配
find -perm /002 其他用戶有寫許可權的文件才會匹配
find -perm -222 只有當文件的所有者、所屬組、其他人三類用戶都有寫許可權才會匹配
find -perm -002 只要其它人具有寫許可權就會匹配,和find -perm /002的作用相同
find -perm -022 所屬組和其他人都具有寫許可權就會匹配
find -perm 002 只匹配 --- --- -w-許可權的文件
處理動作
-print 預設,會把搜索結果列印屏幕,預設是以空格作為分割符。可以使用pring0選項改成使用nul作為分隔符
-ls 把搜索的文件的詳細屬性顯示出來
-fls /PATH/TO/FILE 查找到的每個文件長格式顯示保存至指定文件,相當於 -ls > /PATH/TO/FILE
-delete 把搜索到的文件刪除,太危險,慎用
-ok COMMAND {} \; 對查找到的每個文件交由COMMAND指定的命令執行,但是在執行前會互動式提問
-exec COMMAND {} \; 對超找到的每個文件交由COMMAND指定的命令執行,不會交互提問直接執行
{} 指的是find搜索的的文件,可以想成一個變數,此變數引用find搜索到的文件
\; 交由COMMAND執行 必須要有\;結束
find /data -exe rm {} \ 刪除搜索到的文件
find /var -size +10M -mtime +10 -ok mv {} /data \ 把在VAR下搜索到的大於10M時間超過10天之前的文件移動到data目錄下
find /data -name "*.txt" -exec cp {} {}.bak \; 批量加尾碼。註意雙{}的使用
小技巧:利用find 和 mv 組合批量加尾碼名:
[root@CentOS7 tmp]# ll total 0 -rw-r--r-- 1 root root 0 May 3 05:40 a -rw-r--r-- 1 root root 0 May 3 05:40 b -rw-rw-rw- 1 root root 0 May 3 05:40 c -rw-r--r-- 1 root root 0 May 3 05:40 d -rw-r--r-- 1 root root 0 May 3 05:40 e -r-------- 1 root root 0 May 3 05:40 f -rw-r--r-- 1 root root 0 May 3 05:40 g [root@CentOS7 tmp]# find . -type f -exec mv {} {}.haha \; #小技巧利用find和mv組合批量加尾碼名 [root@CentOS7 tmp]# ll total 0 -rw-r--r-- 1 root root 0 May 3 05:40 a.haha -rw-r--r-- 1 root root 0 May 3 05:40 b.haha -rw-rw-rw- 1 root root 0 May 3 05:40 c.haha -rw-r--r-- 1 root root 0 May 3 05:40 d.haha -rw-r--r-- 1 root root 0 May 3 05:40 e.haha -r-------- 1 root root 0 May 3 05:40 f.haha -rw-r--r-- 1 root root 0 May 3 05:40 g.haha [root@CentOS7 tmp]#
練習:
1、查找/var目錄下屬主為root,且屬組為mail的所有文件或目錄;
find /var -user root -a -group mail -ls
2、查找/usr目錄下不屬於root,bin或hadoop的所有文件或目錄;用兩種方法;
find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls
find /user -not -user root -a -not -user bin -a -not -user hadoop -ls
3、查找/etc目錄下最近一周內其內容修改過,且屬主不是root用戶也不是hadoop用戶的文件或目錄;
find /etc -mtime -7 -a -not -user root -a -not -user hadoop -ls
find /etc -mtime -7 -a -not \( -user root -o -user hadoop \) -ls
4、查找當前系統上沒有屬主或屬組,且最近一周內曾被訪問過的文件或目錄;
find \( -nouser -o -nogroup \) -a -atime -7 -ls
5、查找/etc目錄下大於1M且類型為普通文件的所有文件;
find /etc/ -size +1M -a -type f -ls
6、查找/etc目錄下所有用戶都沒有寫許可權的文件;
find /etc -not -perm /222 -type f -ls
7、查找/etc目錄至少有一類用戶沒有執行許可權的文件;
find /etc -not -perm -111 -type f -ls
8、查找/etc/init.d/目錄下,所有用戶都有執行許可權,且其它用戶有寫許可權的所有文件;
find /etc/init.d -perm -113 -type f -ls