Find命令
由于f i n d具有強大的功能,所以它的選項也很多,其中大部分選項都值得我們花時間來了解一下。即使系統(tǒng)中含有網(wǎng)絡(luò)文件系統(tǒng)(NFS),find命令在該文件系統(tǒng)中同樣有效,只你具有相應(yīng)的權(quán)限。在運行一個非常消耗資源的find命令時,很多人都傾向于把它放在后臺執(zhí)行,因為遍歷一個大的文件系統(tǒng)可能會花費很長的時間(這里是指3
一.F i n d命令的一般形式為:
find pathname -options [-print -exec -ok]
pathname: find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統(tǒng)根目錄。
-print: find命令將匹配的文件輸出到標準輸出。
-exec: find命令對匹配的文件執(zhí)行該參數(shù)所給出的s h e l l命令。相應(yīng)命令的形式為
' command' {} \;,注意{ }和\;之間的空格。
-ok: 和-exec的作用相同,只不過以一種更為安全的模式來執(zhí)行該參數(shù)所給出的
s h e l l命令,在執(zhí)行每一個命令之前,都會給出提示,讓用戶來確定是否執(zhí)行。
find命令選項
-name:按照文件名查找文件。
-perm:按照文件權(quán)限來查找文件。
-prune:使用這一選項可以使f i n d命令不在當前指定的目錄中查找,如果同時使用-depth選項,那么 -prune將被f i n d命令忽略。
-user: 按照文件屬主來查找文件。
-group:按照文件所屬的組來查找文件。
-mtime -n +n:按照文件的更改時間來查找文件,- n表示文件更改時間距現(xiàn)在n天以內(nèi)+n
表示文件更改時間距現(xiàn)在n天以前。F i n d命令還有- a t i m e和- c t i m e選項,但它們
都和- m t i m e選項。
-nogroup:查找無有效所屬組的文件,即該文件所屬的組在/ e t c / g r o u p s中不存在。
-nouser:查找無有效屬主的文件,即該文件的屬主在/ e t c / p a s s w d中不存在。
-newer file1 ! file2:查找更改時間比文件f i l e 1新但比文件f i l e 2舊的文件。
-type 查找某一類型的文件,諸如:
b - 塊設(shè)備文件。
d - 目錄。
c - 字符設(shè)備文件。
p - 管道文件。
l - 符號鏈接文件。
f - 普通文件
-size n:[c] 查找文件長度為n塊的文件,帶有c時表示文件長度以字節(jié)計。
-depth:在查找文件時,首先查找當前目錄中的文件,然后再在其子目錄中查找。
-fstype:查找位于某一類型文件系統(tǒng)中的文件,這些文件系統(tǒng)類型通常可以在配置文件/etc/fstab中找到,該配置文件中包含了本系統(tǒng)中有關(guān)文件系統(tǒng)的信息。
-mount:在查找文件時不跨越文件系統(tǒng)m o u n t點。
-follow:如果f i n d命令遇到符號鏈接文件,就跟蹤至鏈接所指向的文件。
-cpio:對匹配的文件使用c p i o命令,將這些文件備份到磁帶設(shè)備中。
實例:
exec選項后面跟隨著所要執(zhí)行的命令或腳本,然后是一對兒{ },一個空格和一個\,最后是一個分號。
為了使用exec選項,必須要同時使用p r i n t選項。如果驗證一下find命令,會發(fā)現(xiàn)該命令只輸出從當前路徑起的相對路徑及文件名。
例如:為了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec選項中
1. # find . -type f -exec ls -l {} \;
2.
-rw-r--r-- 1 root root
34928
3.
-rw-r--r-- 1 root root
12959
4.
-rw-r--r-- 1 root root 180
上面的例子中,f i n d命令匹配到了當前目錄下的所有普通文件,并在- e x e c選項中使用ls -l命令將它們列出。
在/logs目錄中查找更改時間在5日以前的文件并刪除它們:
find logs -type f -mtime +5 -exec rm {} \;
在下面的例子中, f i n d命令在當前目錄中查找所有文件名以. L O G結(jié)尾、更改時間在5日以上的文件,并刪除它們,只不過在刪除之前先給出提示。
1. find . -name "*.conf" -mtime +5 -ok rm {} \;
2. < rm ... ./conf/httpd.conf > ? n
按y鍵刪除文件,按n鍵不刪除。
在下面的例子中我們使用grep命令。find命令首先匹配所有文件名為“passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后
執(zhí)行grep命令看看在這些文件中是否存在一個sam用戶。
1. find /etc -name "passwd*" -exec grep "sam" {} \;
2. sam:x:501:501::/usr/sam:/bin/bash
使用find 命令查找某個時間段的shell怎么寫。比如11點到12
創(chuàng)建一個腳本judgetime,內(nèi)容如下:
Ls –l $* | awk
'{split($8,hour,":");if((hour[1]>23 || hour[1] < 1)&&hour[1]<24)print}'
到要查找的目錄下,運行
find ./ -name "*" -exec judgetime {} \;
注意時間格式為24小時制。
二.find 命令的例子
查找當前用戶主目錄下的所有文件,下面兩種方法都可以使用:
1. $ find $HOME -print
2. $ find ~ -print
為了在當前目錄中文件屬主具有讀、寫權(quán)限,并且文件所屬組的用戶和其他用戶具有讀權(quán)限的文件,可以用:
find . -type f -perm 644 -exec ls -l {} \;
為了查找系統(tǒng)中所有文件長度為0的普通文件,并列出它們的完整路徑,可以用:
find / -type f -size 0 -exec ls -l {} \;
查找/var/logs目錄中更改時間在7日以前的普通文件,并在刪除之前詢問它們:
find /var/logs -type f -mtime +7 -ok rm {} \;
為了查找系統(tǒng)中所有屬于root組的文件,可以用:
1. $find . -group root -exec ls -l {} \;
2. -rw-r--r-- 1 root root 595 10月 31 01:09 ./fie1
下面的find命令將刪除當目錄中訪問時間在7日以來、含有數(shù)字后綴的admin.log文件。該命令只檢查三位數(shù)字,所以相應(yīng)文件的后綴不要超過 999。
先建幾個admin.log*的文件 ,才能使用下面這個命令
1. $ find . -name "admin.log[0-9][0-9][0-9]" -atime -7 -ok
2. rm {} \;
3. < rm ... ./admin.log001 > ? n
4. < rm ... ./admin.log002 > ? n
5. < rm ... ./admin.log042 > ? n
6. < rm ... ./admin.log942 > ? n
為了查找當前文件系統(tǒng)中的所有目錄并排序,可以用:
1. $ find . -type d |sort
為了查找系統(tǒng)中所有的rmt磁帶設(shè)備,可以用:
1. $ find /dev/rmt -print
原書為:為了查找當前文件系統(tǒng)中的所有目錄并排序,可以用:
1.
$ find . -type d -loacl -
2. 已更正為:
3. $ find . -type d |sort
find中的無錯誤輸出的方式:
find . -option optionName > /dev/null
根據(jù)文件的特征查詢方法:
如果只知道某個文件的大小,修改日期等特征也可以使用“find”命令查找出來
例如我們知道一個Linux文件大小為1,500 bytes,那么我們可是使用如下命令來查詢find / -size
find / -amin -10 # 查找在系統(tǒng)中最后10分鐘訪問的文件
find / -atime -2 # 查找在系統(tǒng)中最后48小時訪問的文件
find / -empty # 查找在系統(tǒng)中為空的文件或者文件夾
find / -group cat # 查找在系統(tǒng)中屬于 groupcat的文件
find / -mmin -5 # 查找在系統(tǒng)中最后5分鐘里修改過的文件
find / -mtime -1 #查找在系統(tǒng)中最后24小時里修改過的文件
find / -nouser #查找在系統(tǒng)中屬于作廢用戶的文件
find / -user fred #查找在系統(tǒng)中屬于FRED這個用戶的文件
下面的列表就是對find命令所可以指定文件的特征進行查找的部分條件。在這里并沒有列舉所有的查找條件,參考有關(guān)Linux有關(guān)書籍可以知道所有 find命令的查找函數(shù)。
-amin n
查找系統(tǒng)中最后N分鐘訪問的文件
-atime n
查找系統(tǒng)中最后n*24小時訪問的文件
-cmin n
查找系統(tǒng)中最后N分鐘被改變狀態(tài)的文件
-ctime n
查找系統(tǒng)中最后n*24小時被改變狀態(tài)的文件
-empty
查找系統(tǒng)中空白的文件,或空白的文件目錄,或目錄中沒有子目錄的文件夾
-false
查找系統(tǒng)中總是錯誤的文件
-fstype type
查找系統(tǒng)中存在于指定文件系統(tǒng)的文件,例如:ext2 .
-gid n
查找系統(tǒng)中文件數(shù)字組 ID 為 n的文件
-group gname
查找系統(tǒng)中文件屬于gnam文件組,并且指定組和ID的文件
Find命令的控制選項說明:
Find命令也提供給用戶一些特有的選項來控制查找操作。下表就是我們總結(jié)出的最基本,最常用的find命令的控制選項及其用法。
選項
用途描述
-daystart
.測試系統(tǒng)從今天開始24小時以內(nèi)的文件,用法類似 -amin
-depth
使用深度級別的查找過程方式,在某層指定目錄中優(yōu)先查找文件內(nèi)容
-follow
遵循通配符鏈接方式查找; 另外,也可忽略通配符鏈接方式查詢
-help
顯示命令摘要
-maxdepth levels
在某個層次的目錄中按照遞減方法查找
-mount
不在文件系統(tǒng)目錄中查找, 用法類似 -xdev.
-noleaf
禁止在非UNUX文件系統(tǒng),MS-DOS系統(tǒng),CD-ROM文件系統(tǒng)中進行最優(yōu)化查找
-version
打印版本數(shù)字
使用-follow選項后,find命令則遵循通配符鏈接方式進行查找,除非你指定這個選項,否則一般情況下find命令將忽略通配符鏈接方式進行文件查找。
-maxdepth選項的作用就是限制find命令在目錄中按照遞減方式查找文件的時候搜索文件超過某個級別或者搜索過多的目錄,這樣導(dǎo)致查找速度變慢,查找花費的時間過多。例如,我們要在當前(.)目錄技巧子目錄中查找一個名叫fred的文件,我們可以使用如下命令
find . -maxdepth 2 -name fred
假如這個fred文件在./sub1/fred目錄中,那么這個命令就會直接定位這個文件,查找很容易成功。假如,這個文件在./sub1/sub2 /fred目錄中,那么這個命令就無法查找到。因為前面已經(jīng)給find命令在目錄中最大的查詢目錄級別為2,只能查找2層目錄下的文件。這樣做的目的就是為了讓find命令更加精確的定位文件,如果你已經(jīng)知道了某個文件大概所在的文件目錄級數(shù),那么加入-maxdepth n 就很快的能在指定目錄中查找成功。
使用混合查找方式查找文件
find命令可以使用混合查找的方法,例如我們想在/tmp目錄中查找大于100000000字節(jié)并且在48小時內(nèi)修改的某個文件,我們可以使用-and 來把兩個查找選項鏈接起來組合成一個混合的查找方式。
find /tmp -size +
學(xué)習(xí)過計算機語言的朋友都知道,在計算機語言里,使用and ,or 分別表示“與”和“或”的關(guān)系。在Linux系統(tǒng)的查找命令中一樣通用。
還有這樣的例子,
find / -user fred -or -user george
我們可以解釋為在/tmp目錄中查找屬于fred或者george這兩個用戶的文件。
在find命令中還可以使用“非”的關(guān)系來查找文件,如果我們要在/tmp目錄中查找所有不屬于panda的文件,使用一個簡單的
find /tmp ! -user panda
命令就可以解決了。很簡單。
文件信息的參數(shù)和使用方法
選項
用途描述
-exec command;
查找并執(zhí)行命令
-fprint file
打印文件完整文件名
-fprint0 file
打印文件完整文件名包括空的文件
-fprintf file format
打印文件格式
-ok command;
給用戶命令執(zhí)行操作,根據(jù)用戶的Y 確認輸入執(zhí)行
-printf format
打印文件格式
-ls
打印同種文件格式的文件.
三. 查找技巧,find及xargs的使用
xargs
在使用f i n d命令的- e x e c選項處理匹配到的文件時, f i n d命令將所有匹配到的文件一起傳遞給e x e c執(zhí)行。但有些系統(tǒng)對能夠傳遞給e x e c的命令長度有限制,這樣在f i n d命令運行幾分鐘之后,就會出現(xiàn)溢出錯誤。錯誤信息通常是“參數(shù)列太長”或“參數(shù)列溢出”。這就是x a rg s命令的用處所在,特別是與f i n d命令一起使用。
F i n d命令把匹配到的文件傳遞給x a rg s命令,而x a rg s命令每次只獲取一部分文件而不是全部,不像- e x e c選項那樣。這樣它可以先處理最先獲取的一部分文件,然后是下一批,并如此繼續(xù)下去。
在有些系統(tǒng)中,使用- e x e c選項會為處理每一個匹配到的文件而發(fā)起一個相應(yīng)的進程,并非將匹配到的文件全部作為參數(shù)一次執(zhí)行;這樣在有些情況下就會出現(xiàn)進程過多,系統(tǒng)性能下降的問
題,因而效率不高;
而使用x a rg s命令則只有一個進程。另外,在使用x a rg s命令時,究竟是一次獲取所有的參數(shù),還是分批取得參數(shù),以及每一次獲取參數(shù)的數(shù)目都會根據(jù)該命令的選項及系統(tǒng)內(nèi)核中相應(yīng)的可調(diào)參數(shù)來確定。
來看看x a rg s命令是如何同f i n d命令一起使用的,并給出一些例子。
下面的例子查找系統(tǒng)中的每一個普通文件,然后使用x a rg s命令來測試它們分別屬于哪類文件
- #find . -type
f -print | xargs file
- ./.kde/Autostart/Autorun.desktop:
UTF-8 Unicode English text
- ./.kde/Autostart/.directory:
ISO-8859 text\
- ......
在整個系統(tǒng)中查找內(nèi)存信息轉(zhuǎn)儲文件(core dump) ,然后把結(jié)果保存到/tmp/core.log 文件中:
- $ find /
-name "core" -print | xargs echo "" >/tmp/core.log
復(fù)制代碼
上面這個執(zhí)行太慢,我改成在當前目錄下查找
- #find . -name
"file*" -print | xargs echo "" > /temp/core.log
- # cat
/temp/core.log
- ./file6
在當前目錄下查找所有用戶具有讀、寫和執(zhí)行權(quán)限的文件,并收回相應(yīng)的寫權(quán)限:
- # ls -l
- drwxrwxrwx
2 sam adm
4096 10月 30 20:14
file6
- -rwxrwxrwx
2 sam adm
0 10月 31
01:01 http3.conf
- -rwxrwxrwx
2 sam adm
0 10月 31
01:01 httpd.conf
- # find .
-perm -7 -print | xargs chmod o-w
- # ls -l
- drwxrwxr-x
2 sam adm
4096 10月 30 20:14
file6
- -rwxrwxr-x
2 sam adm
0 10月 31
01:01 http3.conf
- -rwxrwxr-x
2 sam adm
0 10月 31
01:01 httpd.conf
用g r e p命令在所有的普通文件中搜索hostname這個詞:
- # find .
-type f -print | xargs grep "hostname"
- ./httpd1.conf:#
different IP addresses or hostnames and have them
handled by the
- ./httpd1.conf:#
VirtualHost: If you want to maintain multiple domains/hostnames
- on your
用g r e p命令在當前目錄下的所有普通文件中搜索hostnames這個詞:
- # find .
-name \* -type f -print | xargs grep "hostnames"
- ./httpd1.conf:#
different IP addresses or hostnames and have them
handled by the
- ./httpd1.conf:#
VirtualHost: If you want to maintain multiple domains/hostnames
- on your
注意,在上面的例子中, \用來取消f i n d命令中的*在s h e l
l中的特殊含義。
下面是find一些常用參數(shù)的例子,有用到的時候查查就行了,像上面前幾個貼子,都用到了其中的的一些參數(shù),也可以用man或查看論壇里 其它貼子有find的命令手冊
1、使用name選項
文件名選項是f i n d命令最常用的選項,要么單獨使用該選項,要么和其他選項一起使用。
可以使用某種文件名模式來匹配文件,記住要用引號將文件名模式引起來。
不管當前路徑是什么,如果想要在自己的根目錄$ H O M E中查找文件名符合* . t x t的文件,使用~作 為' p a t h n a m e參數(shù),波浪號~代表了你的$ H O M E目錄。
- $ find ~
-name "*.txt" -print
想要在當前目錄及子目錄中查找所有的‘ * . t x t’文件,可以用:
- $ find .
-name "*.txt" -print
想要的當前目錄及子目錄中查找文件名以一個大寫字母開頭的文件,可以用:
- $ find .
-name "[A-Z]*" -print
想要在/ e t c目錄中查找文件名以h o s t開頭的文件,可以用:
- $ find /etc
-name "host*" -print
想要查找$ H O M E目錄中的文件,可以用:
- $ find ~
-name "*" -print 或find . -print
要想讓系統(tǒng)高負荷運行,就從根目錄開始查找所有的文件。
- $ find /
-name "*" -print
如果想在當前目錄查找文件名以兩個小寫字母開頭,跟著是兩個數(shù)字,最后是* . t x t的文件,下面的命令就能夠返回名為a x 3 7 . t x t的文件:$
- $find . -name
"[a-z][a-z][0--9][0--9].txt" -print
2、用perm選項
按照文件權(quán)限模式用- p e r m選項。
按文件權(quán)限模式來查找文件的話。最好使用八進制的權(quán)限表示法。
如在當前目錄下查找文件權(quán)限位為7 5 5的文件,即文件屬主可以讀、寫、執(zhí)行,其他用戶可以讀、執(zhí)行的文件,可以用:
- $ find .
-perm 755 -print
還有一種表達方法:在八進制數(shù)字前面要加一個橫杠-,表示都匹配,如-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
- # find .
-perm 006
- # find .
-perm -006
- ./sam
- ./httpd1.conf
- ./temp
3、忽略某個目錄
------我試過了這種避開目錄的方法不管用,還是能看到避開目錄下的東西
如果在查找文件時希望忽略某個目錄,因為你知道那個目錄中沒有你所要查找的文件,那么可以使用- p r u n e選項來指出需要忽略的目錄。在使用- p r u n e選項時要當心,因為如果你同時使用了- d e p t h選項,那么- p r u n e選項就會被f i n d命令忽略。
如果希望在/ a p p s目錄下查找文件,但不希望在/
a p p s / b i n目錄下查找,可以用:
- $ find /apps
-path "/apps/bin" -prune -o -print
-perm選項中,我的解析
還有一種表達方法:在八進制數(shù)字前面要加一個橫杠-,表示都匹配,如-007就相當于777,-006相當于666
使用find查找文件的時候怎么避開某個文件目錄
比如要在/usr/sam目錄下查找不在dir1子目錄之內(nèi)的所有文件
- find /usr/sam
-path "/usr/sam/dir1" -prune -o -print
QUOTE:
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
-
-print
避開多個文件夾
find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o
-print
圓括號表示表達式的結(jié)合。
\ 表示引用,即指示 shell 不對后面的字符作特殊解釋,而留給 find 命令去解釋其意義。
查找某一確定文件,-name等選項加在-o 之后
- #find
/usr/sam \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \)
-prune -o -name "temp" –print
4、使用user和nouser選項
按文件屬主查找文件,如在$ H O M E目錄中查找文件屬主為sam的文件,可以用:
- $ find ~
-user sam -print
在/ e t c目錄下查找文件屬主為u u c p的文件:
- $ find /etc
-user uucp -print
為了查找屬主帳戶已經(jīng)被刪除的文件,可以使用- n o u s e r選項。這樣就能夠找到那些屬主在/ e t c / p a s s w d文件中沒有有效帳戶的文件。在使用- n o u
s e r選項時,不必給出用戶名; f i n d命令能夠為你完成相應(yīng)的工作。
例如,希望在/ h o m e目錄下查找所有的這類文件,可以用:
- $ find /home
-nouser -print
5、使用group和nogroup選項
就像u s e r和n o u
s e r選項一樣,針對文件所屬于的用戶組, f i n d命令也具有同樣的選項,為了在/ a p p s目錄下查找屬于gem用戶組的文件,可以用:
- $ find /apps
-group gem -print
要查找沒有有效所屬用戶組的所有文件,可以使用n o g r o u p選項。下面的f i n d命令從文件系統(tǒng)的根目錄處查找這樣的文件
- $ find /
-nogroup-print
6、按照更改時間或訪問時間等查找文件
如果希望按照更改時間來查找文件,可以使用mtime, atime或ctime選項。如果系統(tǒng)突然沒有可用空間了,很有可能某一個文件的長度在此期間增長迅速,這時就可以用m t i m e選項來查找這樣的文件。
用減號-來限定更改時間在距今n日以內(nèi)的文件,而用加號+來限定更改時間在距今n日以前的文件。
希望在系統(tǒng)根目錄下查找更改時間在5日以內(nèi)的文件,可以用:
- $ find /
-mtime -5 -print
為了在/ v a r / a d m目錄下查找更改時間在3日以前的文件,可以用:
- $ find
/var/adm -mtime +3 -print
find
中的 -ctime 和 -mtime ,-atime 區(qū)別?
文件的 Access time,atime 是在讀取文件或者執(zhí)行文件時更改的。
文件的 Modified
time,mtime 是在寫入文件時隨文件內(nèi)容的更改而更改的。
文件的 Create
time,ctime 是在寫入文件、更改所有者、權(quán)限或鏈接設(shè)置時隨 Inode 的內(nèi)容更改而更改的。