避開多個文件夾
find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print
圓括號表示表達式的結合。
\ 表示引用,即指示 shell 不對後面的字符作特殊解釋,而留給 find 命令去解釋其意義。
查找某一確定文件,-name等選項加在-o 之後
#find /usr/sam \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -name "temp" –print
1.1.1.1 user和nouser選項
按文件屬主查找文件,如在$HOME目錄中查找文件屬主爲sam的文件,可以用:
$ find ~ -user sam -print
在/etc目錄下查找文件屬主爲uucp的文件:
$ find /etc -user uucp -print
爲了查找屬主帳戶已經被刪除的文件,可以使用-nouser選項。這樣就能夠找到那些屬主在/etc/passwd文件中沒有有效帳戶的文件。在使用-nouser選項時,不必給出用戶名; find命令能夠爲你完成相應的工作。
例如,希望在/home目錄下查找所有的這類文件,可以用:
$ find /home -nouser -print
1.1.1.2 group和nogroup選項
就像user和nouser選項一樣,針對文件所屬於的用戶組, find命令也具有同樣的選項,爲了在/apps目錄下查找屬於gem用戶組的文件,可以用:
$ find /apps -group gem -print
要查找沒有有效所屬用戶組的所有文件,可以使用nogroup選項。
從文件系統的根目錄處查找這樣的文件,可以用:
$ find / -nogroup-print
1.1.1.3 按照更改時間或訪問時間等查找文件
如果希望按照更改時間來查找文件,可以使用m t i m e,atime或ctime選項。如果系統突然沒有可用空間了,很有可能某一個文件的長度在此期間增長迅速,這時就可以用m t i m e選項來查找這樣的文件。
用減號-來限定更改時間在距今n日以內的文件,而用加號+來限定更改時間在距今n日以前的文件。
希望在系統根目錄下查找更改時間在5日以內的文件,可以用:
$ find / -mtime -5 -print
爲了在/ v a r / a d m目錄下查找更改時間在3日以前的文件,可以用:
$ find /var/adm -mtime +3 –print
1.1.1.4 查找比某個文件新或舊的文件
如果希望查找更改時間比某個文件新但比另一個文件舊的所有文件,可以使用-newer選項。它的一般形式爲:
newest_file_name ! oldest_file_name
其中,!是邏輯非符號。
查找更改時間比文件sam新但比文件temp舊的文件:
例:有兩個文件
-rw-r--r-- 1 sam adm 0 10月 31 01:07 fiel
-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 -newer httpd1.conf ! -newer temp -ls
1077669 0 -rwxrwxr-x 2 sam adm 0 10月 31 01:01 ./httpd.conf
1077671 4 -rw-rw-rw- 1 root root 2792 10月 31 20:19 ./temp
1077673 0 -rw-r--r-- 1 sam adm 0 10月 31 01:07 ./fiel
查找更改時間在比temp文件新的文件:
$ find . -newer temp -print
1.1.1.5 type選項
在/etc目錄下查找所有的目錄,可以用:
$ find /etc -type d -print
在當前目錄下查找除目錄以外的所有類型的文件,可以用:
$ find . ! -type d -print
在/etc目錄下查找所有的符號鏈接文件,可以用:
$ find /etc -type l –print
1.1.1.6 size選項
可以按照文件長度來查找文件,這裏所指的文件長度既可以用塊( b l o c k)來計量,也可以用字節來計量。以字節計量文件長度的表達形式爲N c;以塊計量文件長度只用數字表示即可。
在按照文件長度查找文件時,一般使用這種以字節表示的文件長度,在查看文件系統的大小,因爲這時使用塊來計量更容易轉換。
在當前目錄下查找文件長度大於1 M字節的文件:
$ find . -size +1000000c -print
在/home / a p a c h e目錄下查找文件長度恰好爲1 0 0字節的文件:
$ find /home/apache -size 100c -print
在當前目錄下查找長度超過1 0塊的文件(一塊等於5 1 2字節):
$ find . -size +10 -print
1.1.1.7 depth選項
在使用find命令時,可能希望先匹配所有的文件,再在子目錄中查找。使用d e p t h選項就可以使find命令這樣做。這樣做的一個原因就是,當在使用find命令向磁帶上備份文件系統時,希望首先備份所有的文件,其次再備份子目錄中的文件。
在下面的例子中, find命令從文件系統的根目錄開始,查找一個名爲C O N . F I L E的文件。
它將首先匹配所有的文件然後再進入子目錄中查找。
$ find / -name "CON.FILE" -depth –print
1.1.1.8 mount選項
在當前的文件系統中查找文件(不進入其他文件系統),可以使用find命令的m o u n t選項。
從當前目錄開始查找位於本文件系統中文件名以X C結尾的文件:
$ find . -name "*.XC" -mount –print
1.1.1.9 cpio選項
cpio命令可以用來向磁帶設備備份文件或從中恢復文件。可以使用find命令在整個文件系統中(更多的情況下是在部分文件系統中)查找文件,然後用cpio命令將其備份到磁帶上。
如果希望使用cpio命令備份/etc、/home和/apps目錄中的文件,可以使用下面所給出的命令,不過要記住你是在文件系統的根目錄下:
#cd /
#find etc home apps -depthe -print | cpio -ivcdC65535 -o
在上面的例子中,應當注意到路徑中缺少/。這叫作相對路徑。之所以使用相對路徑,是因爲在從磁帶中恢復這些文件的時候,可以選擇恢復文件的路徑。例如,可以將這些文件先恢復到另外一個目錄中,對它們進行某些操作後,再恢復到原始目錄中。如果在備份時使用了絕對路徑,例如/etc,那麼在恢復時,就只能恢復到/etc目錄中去,別無其他選擇。在上面的例子中,我告訴find命令首先進入/etc目錄,然後是/home和/apps目錄,先匹配這些目錄下
的文件,然後再匹配其子目錄中的文件,所有這些結果將通過管道傳遞給cpio命令進行備份。
順便說一下,在上面的例子中cpio命令使用了C65536選項,本可以使用B選項,不過這樣每塊的大小隻有512 字節,而使用了C65536 選項後,塊的大小變成了64K 字節(65536/1024)。
1.1.1.10 exec和ok選項
使用find時,只要把想要的操作寫在一個文件裏,就可以用exec來配合find查找,很方便的(在有些操作系統中只允許-exec選項執行諸如ls或ls -l這樣的命令)。大多數用戶使用這一選項是爲了查找舊文件並刪除它們。建議在真正執行r m命令刪除文件之前,最好先用ls命令看一下,確認它們是所要刪除的文件。
exec選項後面跟隨着所要執行的命令或腳本,然後是一對兒{ },一個空格和一個\,最後是一個分號。
爲了使用exec選項,必須要同時使用print選項。如果驗證一下find命令,會發現該命令只輸出從當前路徑起的相對路徑及文件名。
例如:爲了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的- exec選項中:
# find . -type f -exec ls -l {} \;
-rw-r--r-- 1 root root 34928 2003-02-25 ./conf/httpd.conf
-rw-r--r-- 1 root root 12959 2003-02-25 ./conf/magic
-rw-r--r-- 1 root root 180 2003-02-25 ./conf.d/README
上面的例子中,find命令匹配到了當前目錄下的所有普通文件,並在-exec選項中使用ls -l命令將它們列出。
在/logs目錄中查找更改時間在5日以前的文件並刪除它們:
$ find logs -type f -mtime +5 -exec rm {} \;
記住,在s h e l l中用任何方式刪除文件之前,應當先查看相應的文件,一定要小心!當使用諸如m v或r m命令時,可以使用- exec選項的安全模式。它將在對每個匹配到的文件進行操作之前提示你。
在下面的例子中, find命令在當前目錄中查找所有文件名以.LOG結尾、更改時間在5日以上的文件,並刪除它們,只不過在刪除之前先給出提示。
$ find . -name "*.conf" -mtime +5 -ok rm {} \;
按y鍵刪除文件,按n鍵不刪除。
任何形式的命令都可以在-exec選項中使用。
在下面的例子中我們使用grep命令。find命令首先匹配所有文件名爲“passwd*”的文件,例如passwd、passwd.old、passwd.bak,然後執行grep命令看看在這些文件中是否存在一個sam用戶。
# find /etc -name "passwd*" -exec grep "sam" {} \;
sam:x:501:501::/usr/sam:/bin/bash
1.1.1.11 xargs
在使用find命令的- exec選項處理匹配到的文件時, find命令將所有匹配到的文件一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘之後,就會出現溢出錯誤。錯誤信息通常是“參數列太長”或“參數列溢出”。這就是xargs命令的用處所在,特別是與find命令一起使用。
Find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是全部,不像- exec選項那樣。這樣它可以先處理最先獲取的一部分文件,然後是下一批,並如此繼續下去。
在有些系統中,使用- exec選項會爲處理每一個匹配到的文件而發起一個相應的進程,並非將匹配到的文件全部作爲參數一次執行;這樣在有些情況下就會出現進程過多,系統性能下降的問題,因而效率不高;
而使用xargs命令則只有一個進程。另外,在使用xargs命令時,究竟是一次獲取所有的參數,還是分批取得參數,以及每一次獲取參數的數目都會根據該命令的選項及系統內核中相應的可調參數來確定。
來看看xargs命令是如何同find命令一起使用的,並給出一些例子。
下面的例子查找系統中的每一個普通文件,然後使用xargs命令來測試它們分別屬於哪類文件:
#find . -type f -print | xargs file
./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text
./.kde/Autostart/.directory: ISO-8859 text\
......
在整個系統中查找內存信息轉儲文件(core dump) ,然後把結果保存到/tmp/core.log 文件中:
$ find / -name "core" -print | xargs echo "" >/tmp/core.log
上面這個執行太慢,我改成在當前目錄下查找
#find . -name "file*" -print | xargs echo "" > /temp/core.log
# cat /temp/core.log
./file6
在當前目錄下查找所有用戶具有讀、寫和執行權限的文件,並收回相應的寫權限:
# 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
用grep命令在所有的普通文件中搜索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
用grep命令在當前目錄下的所有普通文件中搜索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
注意,在上面的例子中, \用來取消find命令中的*在s h e l l中的特殊含義。
爲了查找當前文件系統中的所有目錄並排序,可以用:
[code]$ find . -type d -print -local -mount |sort
# find . -type d | sort
.
./dir1
./file6
./.kde
./.kde/Autostart
./sam
./.xemacs
# ls -l
總用量 52
-rw-r--r-- 1 root root 0 10月 31 18:06 admin.log001
-rw-r--r-- 1 root root 0 10月 31 18:06 admin.log002
-rw-r--r-- 1 root root 0 10月 31 18:06 admin.log042
-rw-r--r-- 1 root root 0 10月 31 18:07 admin.log942
drwxr-xr-x 2 root root 4096 10月 31 20:26 dir1
-rw-r--r-- 1 sam adm 0 10月 31 01:07 fiel
drwxrwxr-x 2 sam adm 4096 10月 31 20:25 file6
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf
-rw-r--r-- 1 sam adm 34890 10月 31 00:57 httpd1.conf
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf
drwxrwxr-x 2 gem group 4096 10月 26 19:48 sam
-rw-r--r-- 1 root root 2792 10月 31 20:19 temp
find命令配合使用exec和xargs可以使用戶對所匹配到的文件執行幾乎所有的命令。