2.2 xargs
在使用f i n d 指令的- e x e c 選項處理比對到的檔案時, f i n d指令将所有比對到的檔案一起傳遞
給e x e c執行。不幸的是,有些系統對能夠傳遞給 e x e c的指令長度有限制,這樣在 f i n d 指令運作
幾分鐘之後,就會出現溢出錯誤。錯誤資訊通常是“參數列太長”或“參數列溢出” 。這就是
x a rg s指令的用處所在,特别是與 f i n d指令一起使用。 F i n d指令把比對到的檔案傳遞給 x a rg s命
令,而x a rg s指令每次隻擷取一部分檔案而不是全部,不像 - e x e c選項那樣。這樣它可以先處理
最先擷取的一部分檔案,然後是下一批,并如此繼續下去。在有些系統中,使用 - e x e c 選項會
為處理每一個比對到的檔案而發起一個相應的程序,并非将比對到的檔案全部作為參數一次
執行;這樣在有些情況下就會出現程序過多,系統性能下降的問題,因而效率不高;而使用
20 第一部分 shell
下載下傳
x a rg s指令則隻有一個程序。另外,在使用 x a rg s指令時,究竟是一次擷取所有的參數,還是分
批取得參數,以及每一次擷取參數的數目都會根據該指令的選項及系統核心中相應的可調參
數來确定。
讓我們來看看x a rg s指令是如何同f i n d指令一起使用的,并給出一些例子。
下面的例子查找系統中的每一個普通檔案,然後使用 x a rg s指令來測試它們分别屬于哪類
檔案:
下面的例子查找系統中的每一個普通檔案,然後使用 x a rg s指令來測試它們分别屬于哪類
檔案:
下面的例子在整個系統中查找記憶體資訊轉儲檔案 (core dump) ,然後把結果儲存到
/tmp/core.log 檔案中:
$ find . -name "core" -print | xargs echo "" >/tmp/core.log
下面的例子在 / a p p s / a u d i t目錄下查找所有使用者具有讀、寫和執行權限的檔案,并收回相應
的寫權限:
$ find /apps/audit -perm -7 -print | xargs chmod o-w
在下面的例子中,我們用 g r e p指令在所有的普通檔案中搜尋 d e v i c e這個詞:
$ find / -type f -print | xargs grep "device"
在下面的例子中,我們用 g r e p指令在目前目錄下的所有普通檔案中搜尋 D B O這個詞:
$ find . -name \ *-type f -print | xargs grep "DBO"
注意,在上面的例子中, \用來取消f i n d指令中的*在s h e l l 中的特殊含義。