xargs 指令詳解

簡(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í)輸入yY時(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命令 使用forkexec去調(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ā)送的“信息量”殺死的。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無(wú)法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,218評(píng)論 2 33
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,923評(píng)論 18 139
  • 從沒(méi)有手機(jī)的日子到擁有2G網(wǎng),再?gòu)?G網(wǎng)到4G網(wǎng)的遍布,從校園網(wǎng)cmcc-edu到校園各餐廳WiFi覆蓋,從現(xiàn)金支...
    溫語(yǔ)館閱讀 448評(píng)論 4 2
  • 端午放假回家,我媽突然和我說(shuō),讓我注冊(cè)個(gè)有緣網(wǎng)的賬號(hào),我當(dāng)時(shí)感覺(jué),嗯,這個(gè)世界瘋了。然后我媽接著說(shuō),你爸像你...
    青梅為聘閱讀 364評(píng)論 0 0
  • 明天 就明天吧 我和你一起遠(yuǎn)行 拋棄這四肢爬行的生活 去追尋有光的世界 對(duì)這軀體 我有多么縱容滿足 就有多么深惡...
    東葦閱讀 420評(píng)論 0 3