1. 程式人生 > >文件名查找(二)find

文件名查找(二)find

linux文件

在使用linux時,經常需要進行文件查找。其中查找的命令主要有findgrep。兩個命令是有區的。

區別

(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 "

/root/[^.].*$" 查詢/root當前目錄下的內容 不包括隱藏的

根據屬主、屬組查找:

-user USERNAME:查找屬主為指定用戶(UID)的文件

-group GRPNAME: 查找屬組為指定組(GID)的文件

-uid UserID:查找屬主為指定的UID號的文件

-gid GroupID:查找屬組為指定的GID號的文件

-nouser:查找沒有屬主的文件

-nogroup:查找沒有屬組的文件

根據文件類型查找

-typef;l;d;s;b;c;p

[root@zab ~]# find /root/ -maxdepth 1 -mindepth 1 -type d

根據文件大小來查找:

-size [+|-]#UNIT 常用單位:k, M, Gcbyte

#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

findxargs格式: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目錄下不屬於rootlpgdm的所有文件

[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

2locate命令

locate命令實際是"find -name"的另一種寫法,但是查找方式跟find不同,它比find快得多。因為它不搜索具體目錄,而是在一個數據庫(/var/lib/locatedb)中搜索指定的文件。次數據庫含有本地文件的所有信息,此數據庫是linux系統自動創建的,數據庫由updatedb程序來更新,updatedb是由cron daemon周期性建立的,默認情況下為每天更新一次,所以用locate命令你搜索不到最新更新的文件,除非你在用locate命令查找文件之前手動的用updatedb命令更新數據庫。

技術分享圖片

註意:每次有新文件更新和刪除之後,在updatedb之前數據庫中保存的文件信息不會改變,即新添加一個文件之後,updatedb之前用locate搜索不到指定的文件。同樣再刪除一個文件信息已經在數據庫中的文件時,updatedb之前用locate照樣能搜索到該文件的信息,,盡管此時該文件已經不存在了。

3whereis命令

whereis命令只能用於搜索二進制文件(-b)、源代碼文件(-s)、說明文件(-m)。如果省略參數則返回所有的信息。

技術分享圖片

4which命令

which命令是在PATH變量指定的路徑中搜索指定的系統命令的位置。用echo $PATH可顯示當前PATH變量的值。

技術分享圖片

5type命令

type命令主要用於區分一個命令到底是shell自帶的還是外部獨立的二進制文件提供的。如果是shell自帶的則會提示此命令為shell buildin,否則會列出命令的位置。例如:cdshell自帶的命令,當用which查找時,which會按照PATH變量設置的路徑進行搜索,結果顯示no cd in...;用type cd則顯示cdshell buildin命令。ssh不是shell自帶命令,用type時會顯示ssh的路徑。

技術分享圖片

技術分享圖片


文件名查找(二)find