xargs 是管道處理的瑞士軍刀,特別擅長配合 find 處理大量檔案,解決 -exec 參數溢出與進程過多問題。本文詳解原理與豐富實例。
find -exec 會將所有匹配檔案一次性傳遞,易觸發「參數列表過長」錯誤。find -exec cmd {} \; 每檔案啟動一進程,效能極差。xargs 分批讀取標準輸入,構建命令行分批執行,單一進程處理所有檔案,批次大小由系統參數與選項決定。| 碼 | 含義 |
|---|---|
| 0 | 成功 |
| 123 | 命令返回 1-125 |
| 124 | 命令返回 255 |
| 125 | 命令被信號殺死 |
| 126 | 命令不可執行 |
| 127 | 命令不存在 |
| 1 | 其他錯誤 |
find . -type f -print | xargs grep -i "hostname"
find . -name "jdk*" -type f -print | xargs file
find / -name "core" -print | xargs echo "" > /tmp/core.log
find . -perm 777 -print | xargs chmod o-w
find . -name "jdk*" | xargs ls -l --full-time 2>/dev/null | grep "2011-11-11 03:41:54"
ssh 192.168.30.137 "ps -ef | grep httpd | awk '{print \$2}' | xargs kill -9"
掌握 xargs -I {}、-n、-P、-0 等進階選項,可應對更複雜的批次處理場景。