文件名查找(二)find
區別:
(1)find命令是根據文件的屬性進行查找,如文件名,文件大小,所有者,所屬組,是否為空,訪問時間,修改時間等。查找的是文件
(2)grep是根據文件的內容進行查找,會對文件的每一行按照給定的模式(patter)進行匹配查找。查找的是文件內容
前面已經介紹了grep命令,現在我們學習find命令
1.find命令
可能只搜索用戶具備讀取和執行權限的目錄,默認遞歸搜索
find [OPTION]... [查找路徑] [查找條件] [處理動作]
查找路徑:指定具體目標路徑;默認為當前目錄
查找條件:指定的查找標準,可以文件名、大小、類型、
處理動作:對符合條件的文件做操作,默認輸出至屏
查找條件
指搜索層級 -maxdepth level 最大搜索目錄深度,指定目錄為第1級 -mindepth level 最小搜索目錄深度
[root@zab ~]# find -maxdepth 3 -mindepth 2 -name "*.conf"
根據文件名和inode查找
-name "文件名稱":支持使用glob *, ?, [], [^] 如: -name f* 尋到f開頭的文件
-iname "文件名稱":不區分字母大小寫
-inum n 按inode號查找
示例:
[root@zab ~]# find / -inum 2 -ls
-samefile name 相同inode號的文件 即硬鏈接文件
-links n 鏈接數為n的文件
-regex "PATTERN":以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名稱 支持正則表達式相當於查找文件內容 而不是單單的文件名
[root@zab ~]# find /etc/ -regex ".*\.conf$"
[root@zab ~]# find /root/ -maxdepth 1 -mindepth 1 -regex "
根據屬主、屬組查找:
-user USERNAME:查找屬主為指定用戶(UID)的文件
-group GRPNAME: 查找屬組為指定組(GID)的文件
-uid UserID:查找屬主為指定的UID號的文件
-gid GroupID:查找屬組為指定的GID號的文件
-nouser:查找沒有屬主的文件
-nogroup:查找沒有屬組的文件
根據文件類型查找:
-type(f;l;d;s;b;c;p)
[root@zab ~]# find /root/ -maxdepth 1 -mindepth 1 -type d
根據文件大小來查找:
-size [+|-]#UNIT 常用單位:k, M, G,c(byte)
#UNIT: (#-1, #] 如:6k 表示(5k,6k]
-#UNIT:[0,#-1] 如:-6k 表示[0,5k]
+#UNIT:(#,∞) 如:+6k 表示(6k,∞)
根據時間戳: 以“天”為單位;
-atime [+|-]#,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
示例:
找出/home目錄下5天前以.log結尾的所有文件
find /home/*.log -type f -ctime 5
搜索最近七天內被訪問過的所有文件
find . -type f -atime -7
搜索恰好在七天前被訪問過的所有文件
find . -type f -atime 7
搜索超過七天內被訪問過的所有文件
find . -type f -atime +7
以“分鐘”為單位: -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才 會匹配
組合條件:
與:-a 默認 可以不加 或:-o 非:-not, !
德摩根定律: (非 A) 或 (非 B) = 非(A 且 B) !A -a !B = !(A -o B)
(非 A) 且 (非 B) = 非(A 或 B) !A -o !B = !(A -a B)
-a 的關系大於 -o的關系
示例:
找出/tmp目錄下,屬主不是root,且文件名不以f開頭的文件
find /tmp \( -not -user root -a -not -name 'f*' \) -ls
find /tmp -not \( -user root -o -name 'f*' \) -ls v
排除目錄 v 示例:查找/etc/下,除/etc/sane.d目錄的其它所有.conf後 綴的文件
find /etc -path '/etc/sane.d' -a -prune -o -name "*.conf"
-prune #忽略某個目錄
find /etc \(-path '/etc/sane.d' -o -path '/etc/fonts'\) -a prune -o -name "*.conf"
註意:一個命令作用在多個相同條件時,要加括號 括號要轉義 並且與字符之間有空格 -a 默認 可以不加
[root@centos7 ~]#find /var -not \( -user root -o -user postfix \) -mtime -7
處理動作
v-print:默認的處理動作,顯示至屏幕
v-ls:類似於對查找到的文件執行“ls -l”命令
v-delete:刪除查找到的文件
v-fls file:查找到的所有文件的長格式信息保存至指定文件中
v-ok COMMAND {} \; 對查找到的每個文件執行由COMMAND 指定的命令,對於每個文件執行命令之前,都會交互式要求 用戶確認
v-exec COMMAND {} \; 對查找到的每個文件執行由 COMMAND指定的命令
root@centos6 ~]#find / -perm /002 -a -type f -exec chmod o-w {} \;
v{}: 用於引用查找到的文件名稱自身
vfind傳遞查找到的文件至後面指定的命令時,查找到所有符合 條件的文件一次性傳遞給後面的命令
示例:
找到/etc目錄下屬於root用戶且至少7分鐘沒有訪問過的普通文件,並將它們復制到/tmp/test目錄;
stu19 ~]# find /etc/ -user root -amin +7 -type f -exec cp {} /tmp/test/ \;
參數替換xargs
find和xargs格式:find | xargs COMMAND
v 由於很多命令不支持管道|來傳遞參數,而日常工作中有這個 必要,所以就有了xargs命令 vxargs用於產生某個命令的參數,xargs 可以讀入 stdin 的數 據,並且以空格符或回車符將 stdin 的數據分隔成為 arguments
v 註意:文件名或者是其他意義的名詞內含有空格符的情況 v 有些命令不能接受過多參數,命令執行可能會失敗,xargs可 以解決 v 示例: ls f* |xargs rm
find /sbin -perm +700 |ls -l 這個命令是錯誤的
#find /sbin -perm +700 -ls
find /sbin -perm +7000 | xargs ls -l
示例:
v1、查找/var目錄下屬主為root,且屬組為mail的所有文件
[root@centos7 ~]#find /var -user root -a -group mail
v2、查找/var目錄下不屬於root、lp、gdm的所有文件
[root@centos6 ~]#find /var \( -not -user root -a -not -user lp -a -not -user gdm \) -ls
v3、查找/var目錄下最近一周內其內容修改過,同時屬主不為 root,也不是postfix的文件
[root@centos7 ~]#find /var -not \( -user root -o -user postfix \) -a -mtime -7
v4、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪 問過的文件
[root@centos7 ~]#find / -nouser -o -nogroup -atime -7
v5、查找/etc目錄下大於1M且類型為普通文件的所有文件
[root@centos7 ~]#find /etc/ -size +1M -type f
v6、查找/etc目錄下所有用戶都沒有寫權限的文件
find /etc -not -perm /222 -ls 所有用戶都沒有寫 至少有一個有寫 取反
v7、查找/etc目錄下至少有一類用戶沒有執行權限的文件
root@centos6 ~]#find /etc -not -perm -111 全有執行 取反
v8、查找/etc/init.d目錄下,所有用戶都有執行權限,且其它 用戶有寫權限的文件
[root@centos6 ~]#find /etc/init.d -perm -111 -a -perm -002
刪除0 字節文件或垃圾文件
代碼如下:
find . -type f -size 0 -delete
find . -type f -exec rm -rf {} \;
find . -type f -name "a.out" -exec rm -rf {} \;
find . type f -name "a.out" -delete
find . type f -name "*.txt" -print0 | xargs -0 rm -f
2、locate命令
locate命令實際是"find -name"的另一種寫法,但是查找方式跟find不同,它比find快得多。因為它不搜索具體目錄,而是在一個數據庫(/var/lib/locatedb)中搜索指定的文件。次數據庫含有本地文件的所有信息,此數據庫是linux系統自動創建的,數據庫由updatedb程序來更新,updatedb是由cron daemon周期性建立的,默認情況下為每天更新一次,所以用locate命令你搜索不到最新更新的文件,除非你在用locate命令查找文件之前手動的用updatedb命令更新數據庫。
註意:每次有新文件更新和刪除之後,在updatedb之前數據庫中保存的文件信息不會改變,即新添加一個文件之後,updatedb之前用locate搜索不到指定的文件。同樣再刪除一個文件信息已經在數據庫中的文件時,updatedb之前用locate照樣能搜索到該文件的信息,,盡管此時該文件已經不存在了。
3、whereis命令
whereis命令只能用於搜索二進制文件(-b)、源代碼文件(-s)、說明文件(-m)。如果省略參數則返回所有的信息。
4、which命令
which命令是在PATH變量指定的路徑中搜索指定的系統命令的位置。用echo $PATH可顯示當前PATH變量的值。
5、type命令
type命令主要用於區分一個命令到底是shell自帶的還是外部獨立的二進制文件提供的。如果是shell自帶的則會提示此命令為shell buildin,否則會列出命令的位置。例如:cd為shell自帶的命令,當用which查找時,which會按照PATH變量設置的路徑進行搜索,結果顯示no cd in...;用type cd則顯示cd為shell buildin命令。ssh不是shell自帶命令,用type時會顯示ssh的路徑。
文件名查找(二)find