簡(jiǎn)介
xargs指令可以從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù),并利用這些數(shù)據(jù)“組建”并“執(zhí)行”指令。它的作用是將參數(shù)列表轉(zhuǎn)換成小塊分段傳遞給其他命令,以避免參數(shù)列表過(guò)長(zhǎng)的問(wèn)題。
語(yǔ)法
xargs [-0prtx] [-E eof-str] [-e[eof-str]] [--eof[=eof-str]] [--null]
[-d delimiter] [--delimiter delimiter] [-I replace-str]
[-i[replace-str]] [--replace[=replace-str]] [-l[max-lines]]
[-L max-lines] [--max-lines[=max-lines]] [-n max-args]
[--max-args=max-args] [-s max-chars]
[--max-chars=maxchars] [-P max-procs] [--max-procs=max-procs]
[--process-slot-var=name] [--interactive] [--verbose] [--exit]
[--no-run-if-empty] [--arg-file=file] [--show-limits] [--version]
[--help] [command [initial-arguments]]
詳解
xargs 從標(biāo)準(zhǔn)輸入中讀取使用“空格”或“空行”分隔的“數(shù)據(jù)塊”,并以讀入的“數(shù)據(jù)塊”作為參數(shù)執(zhí)行命令(默認(rèn)情況下執(zhí)行的是 /bin/echo
命令)。需要注意的是,作為參數(shù),從標(biāo)準(zhǔn)輸入中讀入的“數(shù)據(jù)塊”會(huì)跟隨在 初始參數(shù)(initial-arguments)之后。如果你從標(biāo)準(zhǔn)輸入讀入的“數(shù)據(jù)塊”中有些空格并非“數(shù)據(jù)塊”的分隔,而是作為“數(shù)據(jù)塊”的一部分出現(xiàn);你需要把這個(gè)些帶有空格的“數(shù)據(jù)塊”整體放到單引號(hào)或雙引號(hào)中,當(dāng)然你也可以在那些“數(shù)據(jù)塊”內(nèi)部的空格前用反斜杠(\)進(jìn)行轉(zhuǎn)義。另外,標(biāo)準(zhǔn)輸入中多余的空行會(huì)被忽略。
如果不使用 -n
和 -L
選項(xiàng),并且沒(méi)有遇到換行符的情況下,被 xargs 創(chuàng)建的命令的長(zhǎng)度是“貪婪”的,直到達(dá)到系統(tǒng)限制的長(zhǎng)度。而 Command 指令被調(diào)用的次數(shù)正好是標(biāo)準(zhǔn)輸入中“數(shù)據(jù)塊”的行數(shù)。通常情況下,命令被調(diào)用的次數(shù)是小于“數(shù)據(jù)塊”的數(shù)量的;這樣會(huì)在一定程度上提高命令的執(zhí)行效率。有些指令可以并行執(zhí)行,請(qǐng)參考 -P
選項(xiàng)。
在 Unix 系統(tǒng)中,文件名中是可以包含空格和換行符的,如果不對(duì)這種“特殊情況”做處理通常是會(huì)出問(wèn)題的;這種在文件名中的空格和換行會(huì)被 xargs 當(dāng)成“數(shù)據(jù)塊”的分隔符處理。在這種情況下可以使用 -0
選項(xiàng)來(lái)解決問(wèn)題。當(dāng)使用這個(gè)-0
選項(xiàng)時(shí),你需要確保“數(shù)據(jù)塊”之間使用null字符作為分隔符。例如:當(dāng)由GNU 的 find
命令提供xargs的“標(biāo)準(zhǔn)輸”時(shí),就需要為其(find
)提供 -print0
選項(xiàng)來(lái)達(dá)到目的。
如果有任何一次 Command 指令的調(diào)用以 255 的狀態(tài)碼退出,則xargs會(huì)立即停止,并會(huì)放棄此后的所有輸入。錯(cuò)誤信息會(huì)輸出到“標(biāo)準(zhǔn)錯(cuò)誤流”。
參數(shù)說(shuō)明
-0, --null
當(dāng) xargs 使用此選項(xiàng)時(shí),null字符會(huì)被作為“數(shù)據(jù)塊”的分隔符,而引號(hào)(單引用和雙引號(hào))都不在具有特殊含義(所有的字符都代表他們自己);文件結(jié)束符(EOF)也將失效。通常情況下,當(dāng)“數(shù)據(jù)塊”中包含空格、引號(hào)、反斜杠時(shí)適合使用此選項(xiàng),GNU 中的 find
命令 使用 -print0
選項(xiàng)時(shí)就是這種情況。
-a file, --arg-file=file
從文件中讀取“數(shù)據(jù)塊”,而非標(biāo)準(zhǔn)輸入。如果你使用此選項(xiàng),除非“標(biāo)準(zhǔn)輸入”已經(jīng)被重定向到 /dev/null
,否則,執(zhí)行命令時(shí)不會(huì)影響“標(biāo)準(zhǔn)輸入”中的數(shù)據(jù)。
--delimiter=delim, -d delim
xargs 命令會(huì)以此選項(xiàng)指定的“特定字符”作為“數(shù)據(jù)塊”的分隔符。這個(gè)“特定字符”可能是一個(gè)“普通字符”,也可能是一個(gè)C語(yǔ)言風(fēng)格的轉(zhuǎn)義字符(如:\n,反斜杠后進(jìn)一個(gè)十六進(jìn)制或八進(jìn)制數(shù)的轉(zhuǎn)義字符);這些轉(zhuǎn)義字符會(huì)被 printf 函數(shù)處理后再給此選項(xiàng)使用。此選項(xiàng)不支持多字節(jié)字符(也即是僅支持ASCII字符集中的字符)。使用此選項(xiàng)后,標(biāo)準(zhǔn)輸入中的引號(hào)和反斜杠都不再是特殊字符,他們僅代表自身的字面意思。另,-d
選項(xiàng)還會(huì)使 文件結(jié)束符(EOF)失效,此時(shí)xargs 對(duì)待文件結(jié)束符與其他參數(shù)是完全一樣的。當(dāng)“數(shù)據(jù)塊”中包含換行符時(shí)你也可以使用此選項(xiàng)來(lái)處理;雖然使用 --null
選項(xiàng)是更好的選擇。
-E eof-str
設(shè)置“文件結(jié)束符”,xargs 在處理標(biāo)準(zhǔn)輸入時(shí),如果遇到“文件結(jié)束符”,則其后的所有輸入都將被忽略。如果 -E
和 -e
選項(xiàng)都沒(méi)有被使用,則表示在標(biāo)準(zhǔn)輸入中沒(méi)有字符會(huì)被當(dāng)成“文件結(jié)束符”處理。
-e [eof-str], --eof[=eof-str]
此選項(xiàng)和 -E
選項(xiàng)的功能是一樣一樣的。請(qǐng)使用 -E
選項(xiàng),因?yàn)樗欠?POSIX 標(biāo)準(zhǔn)的,而此選項(xiàng)不是。如果使用此選項(xiàng)時(shí) eof-str
被省略了或 -E
和 -e
選項(xiàng)都沒(méi)有被使用,則表示在標(biāo)準(zhǔn)輸入中沒(méi)有字符會(huì)被當(dāng)成“文件結(jié)束符”處理。
-I replace-str
用從標(biāo)準(zhǔn)輸入中得到“數(shù)據(jù)塊”替換 initial-arguments
中出現(xiàn)的 replace-str
。使用此選項(xiàng)后,空格(無(wú)論是否在引號(hào)中)不會(huì)作為“數(shù)據(jù)塊”的分隔符,只有換行會(huì)被作為“數(shù)據(jù)塊”的分隔符。使用此選項(xiàng),同時(shí)意味著使用了 -x
和 -L 1
選項(xiàng)。
Implies -x and -L 1.
-i [replace-str], --replace[=replace-str]
此選項(xiàng)與 -I
選項(xiàng)的功能是一樣的。如果 replace-str 沒(méi)有被指定,則使用默認(rèn)值{}
,此時(shí)的功能與 -I {}
是一樣的。這個(gè)選項(xiàng)已經(jīng)不推薦使用,請(qǐng)使用 -I
選項(xiàng)。
-L max-lines
每個(gè)命令行最多允許有 max-lines
個(gè)非空的輸入行。末尾的空白會(huì)使一個(gè)輸入行在邏輯上延伸到下一行。
使用此選項(xiàng),同時(shí)意味著使用了 -x
選項(xiàng)。
-l [max-lines], --max-lines[=max-lines]
此選項(xiàng)和 -L
選項(xiàng)的功能是一樣的;不同的是此選項(xiàng)中的 max-lines
參數(shù)是可選的。如果 max-lines
沒(méi)有被指定,則使用默認(rèn)值 1 。此選項(xiàng) -l
不已經(jīng)不贊成被使用,請(qǐng)使用符合 POSIX 標(biāo)準(zhǔn)的 -L
選項(xiàng)代替。
-n max-args, --max-args=max-args
每個(gè)命令最多允許有 max-args
個(gè)參數(shù)。如果參數(shù)個(gè)數(shù)達(dá)不到 max-args
個(gè),但參數(shù)的尺寸超過(guò)了限制(請(qǐng)參考 -s
選項(xiàng));此是 xargs 程序?qū)?huì)退出。
-P max-procs, --max-procs=max-procs
同時(shí)運(yùn)行 max-procs
個(gè)進(jìn)程,max-procs
的默認(rèn)值是1。如果 max-procs
被指定為0,xargs 將會(huì)盡可能的運(yùn)行多個(gè)進(jìn)程。請(qǐng)聯(lián)同-n
或-L
選項(xiàng)一起使用,否則可能只會(huì)執(zhí)行一個(gè)進(jìn)程。在 xargs 運(yùn)行期間,你可以向他發(fā)送 SIGUSR1
信號(hào)量要求增加進(jìn)程,或發(fā)送SIGUSR2
信號(hào)量要求減少進(jìn)程。但是你無(wú)法把進(jìn)程數(shù)據(jù)減少到0,因?yàn)樽钚≈凳?。xargs 不會(huì)中止命令的執(zhí)行,當(dāng)要求減少進(jìn)程時(shí),他會(huì)等待,只到有進(jìn)程執(zhí)行完成,只是在執(zhí)行完成的進(jìn)程想要啟動(dòng)其他進(jìn)程時(shí)會(huì)被阻止。
-p, --interactive
交互式的運(yùn)行命令,每個(gè)命令運(yùn)行前都會(huì)在終端詢問(wèn)用戶是否要執(zhí)行。只有在用戶響應(yīng)詢問(wèn)時(shí)輸入y
或Y
時(shí)才會(huì)去運(yùn)行命令。打開此選項(xiàng)的同時(shí),意味著-t
選項(xiàng)也被打開了。
--process-slot-var=name
在每個(gè)子進(jìn)程中分別設(shè)置環(huán)境變量name
的值為不同的值。如果在某個(gè)進(jìn)程中設(shè)置的值與已經(jīng)存在的進(jìn)程設(shè)置的值重復(fù)了,就會(huì)退出這個(gè)進(jìn)程。可以用此來(lái)做負(fù)載均衡。
-r, --no-run-if-empty
如果標(biāo)準(zhǔn)輸入中沒(méi)有任何非空的字符,則不運(yùn)行命令;默認(rèn)情況下即使標(biāo)準(zhǔn)輸入沒(méi)有非空字符,命令也會(huì)被運(yùn)行一次。這個(gè)選項(xiàng)是 GNU 擴(kuò)展的。
-s max-chars, --max-chars=max-chars
一個(gè)命令最多包含 max-chars
個(gè)字符,包括 命令本身、initial-arguments
和標(biāo)識(shí)字符結(jié)束的 nulls 字符。這個(gè)最大值是依賴于操作系統(tǒng)的。
--show-limits
Display the limits on the command-line length which are imposed by the operating system, xargs' choice of buffer size and the -s option. Pipe the input from /dev/null (and perhaps specify --no-run-if-empty) if you don't want xargs to do anything.
-t, --verbose
在執(zhí)行命令之前輸出此命令的“標(biāo)準(zhǔn)錯(cuò)誤流”。
-x, --exit
如果超過(guò) -s
選項(xiàng)指定尺寸,就退出程序。請(qǐng)參考 -s
選項(xiàng)。
--help
輸出 xargs 命令的幫助信息,然后退出。
--version
輸出 xargs 命令的版本號(hào),然后退出。
示例
find /tmp -name core -type f -print | xargs /bin/rm -f
找到目錄/tmp
和其子目錄 下所有名字為 core 的文件,并刪除他們。需要注意的是,如果任何一個(gè)文件名或目錄名中包含空格,這個(gè)指令將無(wú)法正常工作。
find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
找到目錄/tmp
和其子目錄 下所有名字為 core 的文件,并刪除他們。與上面不同的是,文件名或目錄即使包含空格或換行符,也能被正確的處理。
find /tmp -depth -name core -type f -delete
找到目錄/tmp
和其子目錄 下所有名字為 core 的文件,并刪除他們。與上面兩個(gè)例子不同的是,這樣做更有效率。因?yàn)檫@避免了通過(guò)xargs
命令 使用fork
和exec
去調(diào)用 rm
命令。
退出時(shí)的狀態(tài)
xargs 指令退出時(shí)有以下狀態(tài):
0 執(zhí)行成功
123 被調(diào)用的命令以 狀態(tài)碼 1-125 退出
124 被調(diào)用 的命令以 狀態(tài)碼 255 退出
125 被調(diào)用的命令 被 “信號(hào)量” 殺死了
126 無(wú)法執(zhí)行目標(biāo)命令
127 找不到目標(biāo)命令
1 其他未知錯(cuò)誤
當(dāng)退出時(shí)的 狀態(tài)碼 大于128 時(shí),表示程序是被 shell 程序發(fā)送的“信息量”殺死的。