在使用 find 命令的 -exec 選項處理匹配到的文件時, find 命令將所有匹配到的文件一起傳遞給 exec 執行,但有些系統對能夠傳遞給 exec 的命令長度有限制,這樣在 find 命令運行幾分鍾之后,就會出現溢出錯誤。錯誤信息通常是“參數列太長” 或 “參數列溢出”。 這就是 xargs 命令的用處所在,特別是與 find 命令一起使用。
find 命令把匹配到的文件傳遞給 xargs 命令,而 xargs 命令每次只獲取一部分文件而不是全部,不像 -exec選項那樣。這樣它可以先處理最先獲取的一部分文件,然后是下一批,並如此繼續下去。
在有些系統中,使用 -exec 選項會為處理每一個匹配到的文件而發起一個相應的進程,並非將匹配到的文件全部作為參數一次執行;這樣在有些情況下就會出現進程過多,系統性能下降的問題,因而效率不高;而使用 xargs 命令則只有一個進程。另外,在使用 xargs 命令時,究竟是一次獲取所有的參數,還是分批取得參數,以及每一次獲取參數的數目都會根據該命令的選項及系統內核中相應的可調參數來確定。
使用實例:
實例1: 查找系統中的每一個普通文件,然后使用xargs 命令來測試它們分別屬於哪類文件
命令:
find . -type f -print | xargs file
實例2:在整個系統中查找內存信息轉儲文件(core dump ), 然后把結果保存到 /tmp/core.log 文件中
命令:
find / -name "core" -print | xargs echo "" > /tmp/core.log
實例3:在當前目錄下查找所有用戶具有讀、寫和執行權限的文件,並收回相應的寫權限
命令:
find . -perm -7 -print | xargs chmod o-w
實例4:用 grep 命令在所有的普通文件中搜索 hostname 這個詞
find . -type f -print | xargs grep "hostname"
實例5:用 grep 命令在當前目錄下的所有普通文件中搜索 hostnames 這個詞
命令:
find . -name \* -type f -print | xargs grep "hostnames"
實例6:使用xargs 執行 mv
命令:
find . -name "*.log" | xargs -i mv {} test4
實例7:find 后執行 xargs 提示 xargs:argument line too long 解決方法:
命令:
find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f -l1是一次處理一個, -t 是處理之前打印出命令。
好賤, 一開始我看他 給的是 “ -ll ”, 害我測了半天,都提示無效的參數,還以為是倆 LL 呢,最開始還蒙的數字 11, 沒天理。最后才發現 是 l1,前面字母,后面數字。
find . -type f -atime +0 -print0 | xargs -0 -l2 -t rm -f -l2是一次處理2個, -t 是處理之前打印出命令。 (改成這樣好理解)
實例8:使用 -i 參數默認的前面輸出用 {} 代替, -I 參數可以指定其他代替字符,如例子中的[]
命令:
find . -name "file" | xargs -I [] cp [] ..
實例9:xargs 的 -p 參數的使用
命令:
find . -name "*.log" | xargs -p -i mv {}.. -p 參數會提示讓你確認是否執行后面的命令, y 執行, n 不執行。