unix find命令詳解

2021-05-28 13:58:13 字數 3832 閱讀 8694

由於find具有強大的功能,所以它的選項也很多,其中大部分選項都值得我們花時間來了解一下。即使系統中含有網路檔案系統(nfs),find命令在該檔案系統中同樣有效,只你具有相應的許可權。

在執行乙個非常消耗資源的find命令時,很多人都傾向於把它放在後台執行,因為遍歷乙個大的檔案系統可能會花費很長的時間(這裡是指30g位元組以上的檔案系統)。

find pathname -options [-print -exec -ok]

find命令選項options:

引數說明

pathname

find命令所查詢的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄。

-print

find命令將匹配的檔案輸出到標準輸出。

-exec

find命令對匹配的檔案執行該引數所給出的s h e l l命令。相應命令的形式為' command' {} \;,注意和\;之間的空格。

-ok和-exec的作用相同,只不過以一種更為安全的模式來執行該引數所給出的shell命令,在執行每乙個命令之前,都會給出提示,讓使用者來確定是否執行。

-name

按照檔名查詢檔案。

-perm

按照檔案許可權來查詢檔案。

-prune

使用這一選項可以使find命令不在當前指定的目錄中查詢,如果同時使用-depth選項,那麼-prune將被find命令忽略。

-user

按照檔案屬主來查詢檔案。

-group

按照檔案所屬的組來查詢檔案。

-mtime

-mtime -n +n

按照檔案的更改時間來查詢檔案, - n表示檔案更改時間距現在n天以內,+ n表示檔案更改時間距現在n天以前。find命令還有-atime和-ctime選項,但它們都和-mtime選項。

-nogroup

查詢無有效所屬組的檔案,即該檔案所屬的組在/etc/groups中不存在。

-nouser

查詢無有效屬主的檔案,即該檔案的屬主在/etc/passwd中不存在。

-newer

-newer file1 ! file2

查詢更改時間比檔案file1新但比檔案file2舊的檔案。

-type

查詢某一型別的檔案。

b - 塊裝置檔案。

d - 目錄。

c - 字元裝置檔案。

p - 管道檔案。

l - 符號鏈結檔案。

f - 普通檔案。

-size n[c]

查詢檔案長度為n塊的檔案,帶有c時表示檔案長度以位元組計。

-depth

在查詢檔案時,首先查詢當前目錄中的檔案,然後再在其子目錄中查詢。

-fstype

查詢位於某一型別檔案系統中的檔案,這些檔案系統型別通常可以在配置檔案/etc/fstab中找到,該配置檔案中包含了本系統中有關檔案系統的資訊。

-mount

在查詢檔案時不跨越檔案系統mount點。

-follow

如果find命令遇到符號鏈結檔案,就跟蹤至鏈結所指向的檔案。

-cpio

對匹配的檔案使用cpio命令,將這些檔案備份到磁帶裝置中。

1.1.3.1 name選項

檔名選項是find命令最常用的選項,要麼單獨使用該選項,要麼和其他選項一起使用。

可以使用某種檔名模式來匹配檔案,記住要用引號將檔名模式引起來。

不管當前路徑是什麼,如果想要在自己的根目錄$home中查詢檔案名符合*.txt的檔案,使用~作為pathname引數,波浪號~代表了你的$home目錄。

$ find ~ -name "*.txt" -print

想要在當前目錄及子目錄中查詢所有的*.txt檔案,可以用:

$ find . -name "*.txt" –print

想要的當前目錄及子目錄中查詢檔案名以乙個大寫字母開頭的檔案,可以用:

$ find . -name "[a-z]*" –print

想要在/etc目錄中查詢檔案名以host開頭的檔案,可以用:

$ find /etc -name "host*" -print

想要查詢$home目錄中的檔案,可以用:

$ find ~ -name "*" -print 或find . -print

要想讓系統高負荷執行,就從根目錄開始查詢所有的檔案。

$ find / -name "*" -print

如果想在當前目錄查詢檔案名以兩個小寫字母開頭,跟著是兩個數字,最後是*.txt的檔案,下面的命令就能夠返回名為ax37.txt的檔案:

$find . -name "[a-z][a-z][0--9][0--9].txt" -print

1.1.3.2 perm選項

按照檔案許可權模式用-perm選項。

按檔案許可權模式來查詢檔案的話。最好使用八進位制的許可權表示法。

如在當前目錄下查詢檔案許可權位為755的檔案,即檔案屬主可以讀、寫、執行,其他使用者可以讀、執行的檔案,可以用:

$ find . -perm 755 -print

還有一種表達方法:在八進位制數字前面要加乙個橫槓-,表示都匹配,如-007就相當於777,-006相當於666。

# ls -l

-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 http3.conf

-rw-rw-rw-    1 sam      adm         34890 10月 31 00:57 httpd1.conf

-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 httpd.conf

drw-rw-rw-    2 gem      group        4096 10月 26 19:48 sam

-rw-rw-rw-    1 root     root         2792 10月 31 20:19 temp

1.1.3.3 prune選項

如果在查詢檔案時希望忽略某個目錄,因為你知道那個目錄中沒有你所要查詢的檔案,那麼可以使用-prune選項來指出需要忽略的目錄。在使用-prune選項時要當心,因為如果你同時使用了-depth選項,那麼-prune選項就會被find命令忽略。

-perm選項中,我的解析還有一種表達方法:在八進位制數字前面要加乙個橫槓-,表示都匹配,如-007就相當於777,-006相當於666。

使用find查詢檔案的時候怎麼避開某個檔案目錄?

比如要在/usr/sam目錄下查詢不在dir1子目錄之內的所有檔案

$find /usr/sam -path "/usr/sam/dir1" -prune -o -print 

find [path ..] [expression] 在路徑列表的後面的是表示式

-path "/usr/sam" -prune -o -print 是 -path "/usr/sam" -a -prune -o -print 的簡寫表示式按順序求值, -a 和 -o 都是短路求值,與 shell 的 && 和 || 類似。如果 -path "/usr/sam" 為真,則求值 -prune , -prune 返回真,與邏輯表示式為真;否則不求值 -prune ,與邏輯表示式為假。 如果 -path "/usr/sam" -a -prune 為假,則求值 -print ,-print 返回真,或邏輯表示式為真;否則不求值 -print,或邏輯表示式為真。 

這個表示式組合特例可以用偽碼寫為

if -path "/usr/sam" then

-prune

else

iptable 詳解 iptable命令詳解1

p protocal protocol 協議 j jump target i in inte ce name 入口 o out inte ce name 出口 f,fragment 分片 指定 p tcp時 source port port port 原埠 也作 sport destionation...

UNIX crontab命令詳解

crontab命令的功能是在一定的時間間隔排程一些命令的執行。在 etc目錄下有乙個crontab檔案,這裡存放有系統執行的一些排程程式。每個使用者可以建立自己的排程crontab。crontab命令有三種形式的命令列結構 crontab u user file crontab u user e l...

mount命令詳解

名稱 mount 使用許可權 系統管理者或 etc fstab中允許的使用者 使用方式 mount hv mount a ffnrsvw t vfstype mount fnrsvw o options device dir mount fnrsvw t vfstype o options devi...