find -exec -ok 的用法 -mtime

  -exec:  find命令對匹配的文件執行該參數所給出的s h e l l命令。相應命令的形式爲' command' {} \;,注意{ }和\;之間的空格。

-ok:       和- e x e c的作用相同,只不過以一種更爲安全的模式來執行該參數所給出的s h e l l命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。

使用exec或ok來執行shell命令
使用find時,只要把想要的操作寫在一個文件裏,就可以用exec來配合find查找,很方便的

(在有些操作系統中只允許- e x e c選項執行諸如l s或ls -l這樣的命令)。大多數用戶使用這一選項是爲了查找舊文件並刪除它們。建議在真正執行r m命令刪除文件之前,最好先用l s命令看一下,確認它們是所要刪除的文件。

e x e c選項後面跟隨着所要執行的命令或腳本,然後是一對兒{ },一個空格和一個\,最後是一個分號。

爲了使用e x e c選項,必須要同時使用p r i n t選項。如果驗證一下f i n d命令,會發現該命令只輸出從當前路徑起的相對路徑及文件名。

例如:爲了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在f i n d命令的- e x e c選項中

  1. # find . -type f -exec ls -l {} \;
  2. -rw-r--r--    1 root     root        34928 2003-02-25  ./conf/httpd.conf
  3. -rw-r--r--    1 root     root        12959 2003-02-25  ./conf/magic
  4. -rw-r--r--    1 root     root          180 2003-02-25  ./conf.d/README
上面的例子中,f i n d命令匹配到了當前目錄下的所有普通文件,並在- e x e c選項中使用ls -l命令將它們列出。

在/ l o g s目錄中查找更改時間在5日以前的文件並刪除它們:
$ find logs -type f -mtime +5 -exec rm {} \;

記住,在s h e l l中用任何方式刪除文件之前,應當先查看相應的文件,一定要小心!當使用諸如m v或r m命令時,可以使用- e x e c選項的安全模式。它將在對每個匹配到的文件進行操作之前提示你。

在下面的例子中, f i n d命令在當前目錄中查找所有文件名以. L O G結尾、更改時間在5日以上的文件,並刪除它們,只不過在刪除之前先給出提示。
  1. $ find . -name "*.conf"  -mtime +5 -ok rm {} \;
  2. < rm ... ./conf/httpd.conf > ? n
按y鍵刪除文件,按n鍵不刪除。


任何形式的命令都可以在- e x e c選項中使用。

在下面的例子中我們使用g r e p命令。f i n d命令首先匹配所有文件名爲“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然後執
行grep命令看看在這些文件中是否存在一個sam用戶
 

爲此要實現上面文件備份的需要,只需要使用命令

  find /home/oracle –mtime 1 –exec cp {} /backup/{}.backup \;即可。

 

一、find 命令格式


1、find命令的一般形式爲;
find pathname -options [-print -exec -ok ...]

2、find命令的參數;
pathname: find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄。
-print: find命令將匹配的文件輸出到標準輸出。
-exec: find命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式爲'command' {  } \;,注意{   }和\;之間的空格。
-ok: 和-exec的作用相同,只不過以一種更爲安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。

3、find命令選項
 
-name 

按照文件名查找文件。

-perm 
按照文件權限來查找文件。

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

-user 
按照文件屬主來查找文件。

-group 
按照文件所屬的組來查找文件。

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

-nogroup 
查找無有效所屬組的文件,即該文件所屬的組在/etc/groups中不存在。

-nouser 
查找無有效屬主的文件,即該文件的屬主在/etc/passwd中不存在。
-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命令,將這些文件備份到磁帶設備中。
另外,下面三個的區別:
   -amin n
查找系統中最後N分鐘訪問的文件

-atime n
查找系統中最後n*24小時訪問的文件

-cmin n
查找系統中最後N分鐘被改變文件狀態的文件

-ctime n
查找系統中最後n*24小時被改變文件狀態的文件

    -mmin n
查找系統中最後N分鐘被改變文件數據的文件

-mtime n
查找系統中最後n*24小時被改變文件數據的文件

4、使用exec或ok來執行shell命令
使用find時,只要把想要的操作寫在一個文件裏,就可以用exec來配合find查找,很方便的
在有些操作系統中只允許-exec選項執行諸如l s或ls -l這樣的命令。大多數用戶使用這一選項是爲了查找舊文件並刪除它們。建議在真正執行rm命令刪除文件之前,最好先用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 {  } \;
記住:在shell中用任何方式刪除文件之前,應當先查看相應的文件,一定要小心!當使用諸如mv或rm命令時,可以使用-exec選項的安全模式。它將在對每個匹配到的文件進行操作之前提示你。
在下面的例子中, find命令在當前目錄中查找所有文件名以.LOG結尾、更改時間在5日以上的文件,並刪除它們,只不過在刪除之前先給出提示。
$ find . -name "*.conf"  -mtime +5 -ok rm {  } \;
< rm ... ./conf/httpd.conf > ? n
按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

二、find命令的例子;

1、查找當前用戶主目錄下的所有文件:
下面兩種方法都可以使用
$ find $HOME -print
$ find ~ -print


2、讓當前目錄中文件屬主具有讀、寫權限,並且文件所屬組的用戶和其他用戶具有讀權限的文件;
$ find . -type f -perm 644 -exec ls -l {  } \;

3、爲了查找系統中所有文件長度爲0的普通文件,並列出它們的完整路徑;
$ find / -type f -size 0 -exec ls -l {  } \;

4、查找/var/logs目錄中更改時間在7日以前的普通文件,並在刪除之前詢問它們;
$ find /var/logs -type f -mtime +7 -ok rm {  } \;

5、爲了查找系統中所有屬於root組的文件;
$find . -group root -exec ls -l {  } \;
-rw-r--r--    1 root     root          595 10月 31 01:09 ./fie1

6、find命令將刪除當目錄中訪問時間在7日以來、含有數字後綴的admin.log文件。
該命令只檢查三位數字,所以相應文件的後綴不要超過999。先建幾個admin.log*的文件 ,才能使用下面這個命令
$ find . -name "admin.log[0-9][0-9][0-9]" -atime -7  -ok
rm {  } \;
< rm ... ./admin.log001 > ? n
< rm ... ./admin.log002 > ? n
< rm ... ./admin.log042 > ? n
< rm ... ./admin.log942 > ? n

7、爲了查找當前文件系統中的所有目錄並排序;
$ find . -type d | sort

8、爲了查找系統中所有的rmt磁帶設備;
$ find /dev/rmt -print

三、xargs
xargs - build and execute command lines from standard input
在使用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命令中的*在shell中的特殊含義。
find命令配合使用exec和xargs可以使用戶對所匹配到的文件執行幾乎所有的命令。

四、find 命令的參數
下面是find一些常用參數的例子,有用到的時候查查就行了,像上面前幾個貼子,都用到了其中的的一些參數,也可以用man或查看論壇裏其它貼子有find的命令手冊

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

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

# find . -perm 006
# find . -perm -006
./sam
./httpd1.conf
./temp
-perm mode:文件許可正好符合mode
-perm +mode:文件許可部分符合mode
-perm -mode: 文件許可完全符合mode

3、忽略某個目錄
如果在查找文件時希望忽略某個目錄,因爲你知道那個目錄中沒有你所要查找的文件,那麼可以使用-prune選項來指出需要忽略的目錄。在使用-prune選項時要當心,因爲如果你同時使用了-depth選項,那麼-prune選項就會被find命令忽略。
如果希望在/apps目錄下查找文件,但不希望在/apps/bin目錄下查找,可以用:
$ find /apps -path "/apps/bin" -prune -o -print

4、使用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
          -print
避開多個文件夾
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

5、使用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

6、使用group和nogroup選項
就像user和nouser選項一樣,針對文件所屬於的用戶組, find命令也具有同樣的選項,爲了在/apps目錄下查找屬於gem用戶組的文件,可以用:
$ find /apps -group gem -print
要查找沒有有效所屬用戶組的所有文件,可以使用nogroup選項。下面的find命令從文件系統的根目錄處查找這樣的文件
$ find / -nogroup-print

7、按照更改時間或訪問時間等查找文件
如果希望按照更改時間來查找文件,可以使用mtime,atime或ctime選項。如果系統突然沒有可用空間了,很有可能某一個文件的長度在此期間增長迅速,這時就可以用mtime選項來查找這樣的文件。
用減號-來限定更改時間在距今n日以內的文件,而用加號+來限定更改時間在距今n日以前的文件。
希望在系統根目錄下查找更改時間在5日以內的文件,可以用:
$ find / -mtime -5 -print
爲了在/var/adm目錄下查找更改時間在3日以前的文件,可以用:
$ find /var/adm -mtime +3 -print

8、查找比某個文件新或舊的文件
如果希望查找更改時間比某個文件新但比另一個文件舊的所有文件,可以使用-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


9、使用type選項
在/etc目錄下查找所有的目錄,可以用:
$ find /etc -type d -print
在當前目錄下查找除目錄以外的所有類型的文件,可以用:
$ find . ! -type d -print
在/etc目錄下查找所有的符號鏈接文件,可以用
$ find /etc -type l -print

10、使用size選項
可以按照文件長度來查找文件,這裏所指的文件長度既可以用塊(block)來計量,也可以用字節來計量。以字節計量文件長度的表達形式爲N c;以塊計量文件長度只用數字表示即可。
在按照文件長度查找文件時,一般使用這種以字節表示的文件長度,在查看文件系統的大小,因爲這時使用塊來計量更容易轉換。
在當前目錄下查找文件長度大於1 M字節的文件:
$ find . -size +1000000c -print
在/home/apache目錄下查找文件長度恰好爲100字節的文件:
$ find /home/apache -size 100c -print
在當前目錄下查找長度超過10塊的文件(一塊等於512字節):
$ find . -size +10 -print

11、使用depth選項
在使用find命令時,可能希望先匹配所有的文件,再在子目錄中查找。使用depth選項就可以使find命令這樣做。這樣做的一個原因就是,當在使用find命令向磁帶上備份文件系統時,希望首先備份所有的文件,其次再備份子目錄中的文件。
在下面的例子中, find命令從文件系統的根目錄開始,查找一個名爲CON.FILE的文件。
它將首先匹配所有的文件然後再進入子目錄中查找。
$ find / -name "CON.FILE" -depth -print

12、使用mount選項
在當前的文件系統中查找文件(不進入其他文件系統),可以使用find命令的mount選項。
從當前目錄開始查找位於本文件系統中文件名以XC結尾的文件:
$ find . -name "*.XC" -mount -print

 

find規定了源代碼目錄,並對文件名文件類型進行了限定。 
由於我的代碼是在svn管理下的,後面的grep需要將.svn目錄過濾掉。 
然後裏面還用了一些開源項目log4cplus、zlib、gtest,也過濾掉。總之grep進行更加靈活的過濾。 
接下來的xargs作用是把分行的輸出用空格拼接起來,將結果傳遞給wc做輸入。 
wc -l便是統計文件的行數了。 

例如 
find ./src -type f| grep -v .svn | grep -v log4cplus-1.0.3-rc3 |grep -v zlib-1.2.3 |grep -v gtest |xargs wc -l 
find . -name "*.cc" -or -name "*.h" -or -name "*.sh" | grep -v .svn|xargs wc -l 
find .| grep -v CVS| xargs wc -l

 

find . -name "*" | xargs -i cp {}  /home/users/

 

-i 表示 find 傳遞給xargs的結果 由{}來代替 

-I 必須指定替換字符 -i 是否指定替換字符-可選


舉例:
find . | xargs -I {}    cp    {}     $D_PATH

find . | xargs -i cp    {}     $D_PATH

兩者效果相同

 

 

{}代表cp這個命令的第一個參數
 
[linux@/home]# pwd |xargs -i cp /etc/syslog.conf {}
上面這條命令會複製etc目錄下的syslog.conf到當前目錄下 {}這對括號表示的是cp的第二個參數,他的值由前面的pwd命令取得,並由xargs命令傳給cp
 
 

在unix或linux環境中經常會用到find -mtime這樣的寫法來找某某時間點之前的文件,至於如何寫find -mtime +N/-N/N,原來並不是很清楚,今天找了些資料看看,畫下了這個圖,以便理解和記憶:

find -exec -ok 的用法 - zhuzhu - 五事九思
 

從圖上可以看出,以當前時間點開始算起,+表示往左,從該時間點開始再繼續往更早推,可以稱作xx以外;-表示往右,從該時間點算起往後的時間推,可以稱作xx以內;沒有加減號表示據此此前第N天。因此:
我們來看下面這個例子:
我當前的時間2011年3月1日22:31,我有如下的文件:

E:\testpath>ls -l
total 0
-rwxrwxrwa   1 Administrator   None                  0 Feb 25 22:37 111.txt
-rwxrwxrwa   1 Administrator   None                  0 Feb 26 22:38 222.txt
-rwxrwxrwa   1 Administrator   None                  0 Feb 27 22:38 333.txt
-rwxrwxrwa   1 Administrator   None                  0 Feb 28 22:01 444.txt
-rwxrwxrwa   1 Administrator   None                  0 Feb 28 22:30 555.txt
-rwxrwxrwa   1 Administrator   None                  0 Mar  1 22:31 666.txt<--當前時間的文件
-rwxrwxrwa   1 Administrator   None                  0 Mar  2  2011 777.txt
 
E:\testpath>
E:\testpath>

-mtime +2,表示2天以外的,即從距離當前時間(2011-03-01 22:31)的2天前開始算起,往更早的時間推移。因此,距離當前時間的2天爲:2011-02-27 22:31,在此前的文件,會被選出來。

E:\testpath>find ./ -mtime +2
./111.txt
./222.txt

-mtime +1,表示1天以外的,即從距當前時間的1天前算起,往更早的時間推移。因此2011-02-28 22:31前的文件屬於該結果,2011-02-28 22:31後的文件不屬於該結果:

E:\testpath>find ./ -mtime +1
./111.txt
./222.txt
./333.txt
./444.txt
./555.txt

-mtime 2, 距離當前時間第2天的文件,當前時間爲2011-03-01 22:31,往前推2天爲2011-02-27 22:31,因此以此爲時間點,24小時之內的時間爲2011-02-27 22:31~2011-02-28 22:31,因此這段時間內的文件會被選中出來:

E:\testpath>find ./ -mtime 2
./333.txt
./444.txt
./555.txt

-mtime 1, 距離當前時間第1天的文件,當前時間爲2011-03-01 22:31,往前推1天爲2011-02-28 22:31,因此以此爲時間點,24小時之內的時間爲2011-02-28 22:31~2011-03-01 22:31,因此這段時間內的文件會被選中出來:

E:\testpath>find ./ -mtime 1
./666.txt

-mtime -1 表示1天以內的,從距當前時間的1天爲2011-02-28 22:31,往右推移:

E:\testpath>find ./ -mtime -1
./
./666.txt
./777.txt

-mtime -2 表示2天以內的,從距當前時間的2天爲2011-02-27 22:31開始,往右推移:

E:\testpath>find ./ -mtime -2
./
./333.txt
./444.txt
./555.txt
./666.txt
./777.txt

 

 

 
find [起始目錄] 尋找條件 操作
還有種表述方式:find PATH OPTION [-exec COMMAND { } \;]
因爲find命令會根據我們給的option,也就是尋找條件從我們給出的目錄開始對其中文件及其下子目錄中的文件進行遞歸搜索,所以我覺的這個地方說是“起始目錄”是非常好的。
該命令中的尋找條件可以是一個用邏輯運算符 not、and、or 組成的複合條件。邏輯運 算符 and、or、not 的含義爲:
(1) and:邏輯與,在命令中用“-a”表示,是系統缺省的選項,表示只有當所給的條 件都滿足時,尋找條件纔算滿足。例如:
find –name ’tmp’ –xtype c -user ’inin’
% 該命令尋找三個給定條件都滿足的所有文件
(2) or:邏輯或,在命令中用“-o”表示。該運算符表示只要所給的條件中有一個滿足 時,尋找條件就算滿足。例如:
find –name ’tmp’ –o –name ’mina*’
% 該命令查詢文件名爲’tmp’或是匹配’mina*’的所有文件。
(3) not:邏輯非,在命令中用“!”表示。該運算符表示查找不滿足所給條件的文件 。例如:
find ! –name ’tmp’
% 該命令查詢文件名不是’tmp’的所有文件。
需要說明的是:當使用很多的邏輯選項時,可以用括號把這些選項括起來。爲了避免Shell本身對括號引起誤解,在話號前需要加轉義字符“\”來去除括號的意義。例:
find \(–name ’tmp’ –xtype c -user ’inin’ \)
我覺的現在我應該說下出了查詢條件,在find中的option的內容了:
在option中,具體有參數:
-name ’字串’ 查找文件名匹配所給字串的所有文件,字串內可用通配符 *、?、[ ]。
-lname ’字串’ 查找文件名匹配所給字串的所有符號鏈接文件,字串內可用通配符 *、?、[ ]。
-gid n 查找屬於ID號爲 n 的用戶組的所有文件。
-uid n 查找屬於ID號爲 n 的用戶的所有文件。
-group ’字串’ 查找屬於用戶組名爲所給字串的所有的文件。
-user ’字串’ 查找屬於用戶名爲所給字串的所有的文件。
-empty 查找大小爲 0的目錄或文件。
-path ’字串’ 查找路徑名匹配所給字串的所有文件,字串內可用通配符*、?、[ ]。
-perm 權限 查找具有指定權限的文件和目錄,權限的表示可以如711,644。
-size n[bckw] 查找指定文件大小的文件,n 後面的字符表示單位,缺省爲 b,代表512字節的塊。
-type x 查找類型爲 x 的文件,x 爲下列字符之一:
b 塊設備文件
c 字符設備文件
d 目錄文件
p 命名管道(FIFO)
f 普通文件
l 符號鏈接文件(symbolic links)
s socket文件
-xtype x 與 -type 基本相同,但只查找符號鏈接文件。
以時間爲條件查找
-amin n 查找n分鐘以前被訪問過的所有文件。
-atime n 查找n天以前被訪問過的所有文件。
-cmin n 查找n分鐘以前文件狀態被修改過的所有文件。
-ctime n 查找n天以前文件狀態被修改過的所有文件。
-mmin n 查找n分鐘以前文件內容被修改過的所有文件。
-mtime n 查找n天以前文件內容被修改過的所有文件。
-print:將搜索結果輸出到標準輸出。
例子:在root以及子目錄查找不包括目錄/root/bin的,greek用戶的,文件類型爲普通文件的,3天之前的名爲test-find.c的文件,並將結構輸出,find命令如下:
find / -name "test-find.c" -type f -mtime +3 -user greek -prune /root/bin -print
當然在這其中,-print是一個默認選項,我們不必刻意去配置它。
我們再看一下exec選項:
-exec:對搜索的結構指令指定的shell命令。注意格式要正確:"-exec 命令 {} \;"
在}和\之間一定要有空格才行;
{}表示命令的參數即爲所找到的文件;命令的末尾必須以“ \;”結束。
例子:對上述例子搜索出來的文件進行刪除操作,命令如下:
find / -name "test-find.c" -type f -mtime +3 -user greek -prune /root/bin -exec rm {} \;
find命令指令實例:
find . - name ‘main*’ - exec more {} \;
% 查找當前目錄中所有以main開頭的文件,並顯示這些文件的內容。
find . \(- name a.out - o - name ‘*.o’\)> - atime +7 - exec rm {} \;
% 刪除當前目錄下所有一週之內沒有被訪問過的a .out或*.o文件。
% 命令中的“.”表示當前目錄,此時 find 將從當前目錄開始,逐個在其子目錄中查找滿足後面指定條件的文件。
% “\(” 和 “\)” 表示括號(),其中的 “\” 稱爲轉義符。之所以這樣寫是由於對 Shell 而言,(和)另有不同的含義,而不是這裏的用於組合條件的用途。
% “-name a.out” 是指要查找名爲a.out的文件;
% “-name ‘*.o’” 是指要查找所有名字以 .o 結尾的文件。
這兩個 -name 之間的 -o 表示邏輯或(or),即查找名字爲a.out或名字以 .o結尾的文件。
% find命令在當前目錄及其子目錄下找到這佯的文件之後,再進行判斷,看其最後訪問時間 是否在7天以前(條件 -atime +7),若是,則對該文件執行命令 rm(-exec rm {} \;)。
其中 {} 代表當前查到的符合條件的文件名,\;則是語法所要求的。
% 上述命令中第一行的最後一個 \ 是續行符。當命令太長而在一行寫不下時,可輸入一個 \,之後系統將顯示一個 >,指示用戶繼續輸入命令。
 
 

在 Linux 平臺下找檔案不外乎使用威力強大的 find 命令,威力強大的背後就是有一點點學習曲線,不過整體上來說還算簡單,因此想寫一篇文章留下備忘,讓自己日後可以快速查閱參考。

【 基本語法 】

查詢檔案名稱 ( 也可以查詢「目錄名稱」,其中 * 是萬用字元 )

find $HOME -name '*.mp3'

   註1: $HOME 是 Linux 下的一個環境變數,預設指向執行帳號的 HOME 目錄

查詢檔案名稱 (不區分大小寫)

find /etc -iname 'Network'

指定只要搜尋「檔案」名稱

find /var/log -iname '*.log' -type f

指定只要搜尋「目錄」名稱

find /etc -iname 'apache2' -type d

   補充說明:可用的 –type 參數值如下

b      block (buffered) special

c      character (unbuffered) special

d      directory ( 一般目錄 )

p      named pipe (FIFO)

f      regular file ( 一般檔案 )

l      symbolic link

s      socket

D      door (Solaris)

找尋所有檔案大小大於 50MB 的檔案

find /var -type f -size +50M

   註1: 不加上 –name 參數即代表搜尋所有檔案

找尋所有檔案大小小於 50MB 的檔案

find /var -type f -size -50M

尋找超過 7 天沒有被存取或修改過的檔案 (判斷檔案存取時間)

find $HOME -type f -atime +7

尋找曾經在 7 天內被存取或修改過的檔案 (判斷檔案存取時間)

find $HOME -type f -atime -7

尋找超過 10 分鐘沒有被存取或修改過的檔案 (判斷檔案存取時間)

find $HOME -type f -amin +10

尋找曾經在 10 分鐘內被存取或修改過的檔案 (判斷檔案存取時間)

find $HOME -type f -amin -10

尋找檔案建立時間已超過 30 天的檔案

find $HOME -type f -ctime +30

尋找特定使用者的檔案 ( 以帳號名稱 tom 為例 )

find $HOME -type f -user tom

 

【 進階應用 】

刪除 30 天以上未經存取過的暫存檔案 ( 注意: 以下指令最後一個分號(;)前一定要加上反斜線 )

find /tmp -type f -atime +30 -print -exec rm -f '{}' \;

   註1: 加上 –print 是為了讓被刪除的檔案檔名一併顯示在畫面上,這個參數可以省略 
   註2: 使用 –exec 會讓查詢到的每一個檔案路徑代入 ‘{}’ 位置,一個檔案會執行一遍 rm 命令

刪除 30 天以上未經存取過的暫存檔案 ( 使用 xargs 當成單一命令的參數 )

find /tmp -type f -print0 | xargs -0 rm -v

   註1: 加上 –print0 是為了讓輸出的結果不以「斷行字元」分隔,而改以 null 為結果的分隔字元 
   註2: 使用 xargs 命令加上 –0 是為了讓傳入的資料以 null 字元當成參數的分隔 
   註3: 使用 rm 命令加上 –v 是為了能顯示出被刪除的檔案名稱,這個參數可以省略 
   註4: 使用 xargs 會將所有 find 命令查到的檔案轉換成 rm 的參數列,如果檔案過多可能會執行失敗! 
   註5: 使用 xargs 可確保後面的程式 ( rm ) 只執行一次,所以理論上執行速度較快!

相同參數需輸入多筆並且以「或」邏輯運算時要用 –o 參數串接起來

例1:同時找兩種檔名樣式的檔案

find $HOME -name '*.mp3' -o -user '*.ogg'

例2:同時找兩個擁有者的檔案

find /usr/local -user user1 -o -user user2

 

【 注意事項 】

  • 使用萬用字元時務必加上單引號( ' ) 

    !!以下是錯誤示範!!

    [user1@server ~]# find $HOME -name *.txt 
    find: paths must precede expression 
    Usage: find [path...] [expression]

 

find -exec -ok 的用法 -mtime - zhuzhu - 五事九思  (大連Linux主機維護)

 

find -exec -ok 的用法 -mtime - zhuzhu - 五事九思  (大連Linux主機維護)
 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章