天天看點

[unix shell筆記] - 和find指令結合使用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

/etc/protocols: English text

/etc/security : ASCII text

下面的例子在整個系統中查找記憶體資訊轉儲檔案(core dump) ,然後把結果儲存到/tmp/core.log 檔案中:

$ find . -name "core" -print | xargs echo "" >/tmp/core.log

下面的例子在/apps/audit目錄下查找所有使用者具有讀、寫和執行權限的檔案,并收回相應的寫權限:

$ find /apps/audit -perm -7 -print | xargs chmod o-w

在下面的例子中,我們用grep指令在所有的普通檔案中搜尋device這個詞:

$ find / -type f -print | xargs grep "device"

在下面的例子中,我們用grep指令在目前目錄下的所有普通檔案中搜尋DBO這個詞:

$ find . -name *\-type f -print | xargs grep "DBO"

注意,在上面的例子中, \用來取消find指令中的*在shell中的特殊含義。

轉載于:https://blog.51cto.com/happyland/710370