04_find和xargs

1、find功能,查找目錄或文件
查找具有某些特徵文件的命令。
可遍歷當前目錄甚至於整個文件系統來查找某些文件或目錄。
遍歷大文件系統時,要放在後臺執行
2、find命令格式
find pathname -options [-print -exec -ok ...]
3、find命令參數
pathname: find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄。
-print: find命令將匹配的文件輸出到標準輸出。
-exec: find命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式爲'command' {  } \;,注意{   }和\;之間的空格。
-ok: 和-exec的作用相同,只不過以一種更爲安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。
4、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小時被改變文件數據的文件

例子

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

find . -name "[A-Z]*" -print
find . -name "[a-z]*" -print

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

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

//以時間點爲準查找文件,假設當前時間爲
1)已當前時間開始算起,+表示n天以前,從n天以前的時間點算起,往左算
find . -mtime +n

2)距離當前時間第n天的文件,往右算
find . -mtime -n

3)距離當前時間n天以內
find . -mtime n

//查找當前目錄 文件類型是普通文件 文件權限664 
find . -type f -perm 664 -exec ls -l {} \;

//查找 大小爲0的普通文件
find . -type f -size 0 -exec ls -l {} \;

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

//查找系統中所有屬於 hzmct 組的文件
find . -group hzmct -exec ls -l {} \;

//find命令將刪除據現在5天以內、含有數字的ad.log文件
find . -name "ad.log[0-9][0-9][0-9]" -atime -5 -ok ls -l { } \;

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

//用grep命令在當前目錄下的所有普通文件中搜索hostnames這個詞
find . -type f -print | xargs grep "hostnames"
find . -name \* -type f -print | xargs grep "hostnames"

爲什麼要使用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命令時,究竟是一次獲取所有的參數,還是分批取得參數,以及每一次獲取參數的 -7數目都會根據該命令的選項及系統內核中相應的可調參數來確定。
來看看xargs命令是如何同find命令一起使用的,並給出一些例子。
在當前目錄下查找所有用戶具有讀、寫和執行權限的文件,並收回相應的寫權限:
# ls -l
drwxrwxrwx    2 sam      adm          4096 1030 20:14 file6
-rwxrwxrwx    2 sam      adm             0 1031 01:01 http3.conf
-rwxrwxrwx    2 sam      adm             0 1031 01:01 httpd.conf

# find . -perm -7 -print | xargs chmod o-w
# ls -l
drwxrwxr-x    2 sam      adm          4096 1030 20:14 file6
-rwxrwxr-x    2 sam      adm             0 1031 01:01 http3.conf
-rwxrwxr-x    2 sam      adm             0 1031 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可以使用戶對所匹配到的文件執行幾乎所有的命令。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章