1. 程式人生 > >Linux基礎知識之xargs命令

Linux基礎知識之xargs命令

昨天在給伺服器做年終“大掃除”整理時,發現有個目錄下因為檔案過多而刪除失敗,最終使用 xargs 才搞定,於是順便來記錄下。

在執行某些命令時,當 Linux 某個目錄下檔案過多就會因為“引數列表過長”而報錯無法執行。比如,我要清空/var/spool/clientmqueue/下的龐大數量的臨時檔案,如果直接執行 rm  -f  *,有時就會會出現“引數列表過長”的錯誤提示,因為 linux 下一般的命令的引數的總長度不能超過 4096 個位元組。

這時,xargs 就應該上場了了,由於伺服器數量很多,我直接在每臺伺服器上執行如下命令,即可清理此資料夾內的所有檔案:

Shell
12 #程式碼中的$8,不通系統發行版本可能有所區別,具體使用 ls -l 檢視檔名在那一列即可cd/var/spool/clientmqueue/&&ls-l/var/spool/clientmqueue
/|awk{'print $8'}|xargsrm-f

下面就記錄下 xargs 的用法好了:

命令列語法:

Shell
12345678910111213141516171819202122232425262728 用法:xargs[-0prtx][--interactive][--null][-d|--delimiter=delim][-Eeof-str][-e[eof-str]][--eof[=eof-str]][-Lmax-lines][-l[max-lines]][--max-lines[=max-lines]][-Ireplace-str][-i[replace-str]][--replace[=replace-str]][-nmax-args][--max-args=max-args][-smax-chars][--max-chars=max-chars][-Pmax-procs][--max-procs=max-procs][--verbose][--exit][--no-run-if-empty][--arg-file=file][--version][--help][指令[指令的引數]]引數解釋:-0sdtin含有特殊字元時候,將其當成一般字元,想/'空格等例如:root@localhost:~/test#echo "//"|xargs  echo    root@localhost:~/test#echo "//"|xargs -0 echo    /-afile從檔案中讀入作為sdtin,(看例一)-eflag,注意有的時候可能會是-Eflag必須是一個以空格分隔的標誌,當xargs分析到含有flag這個標誌的時候就停止。(例二)-p當每次執行一個argument的時候詢問一次使用者。(例三)-nnum後面加次數,表示命令在執行的時候一次用的argument的個數,預設是用所有的。(例四)-t表示先列印命令,然後再執行。(例五)-i或者是-I,這得看linux支援了,將xargs的每項名稱,一般是一行一行賦值給{},可以用{}代替。(例六)-rno-run-if-emptyxargs的輸入為空的時候則停止xargs,不用再去執行了。(例七)-snum命令列的最好字元數,指的是xargs後面那個命令的最大命令列字元數。(例八)-Lnum Useatmost max-lines nonblank input lines per commandline.-s是含有空格的。-l-L-ddelim分隔符,預設的xargs分隔符是回車,argument的分隔符是空格,這裡修改的是xargs的分隔符(例九)-xexit的意思,主要是配合-s使用。-P修改最大的程序數,預設是1,為0時候為asmany asit can,這個例子我沒有想到,應該平時都用不到的吧。

xargs 工作原理就是將多個引數分離後依次處理,上面的例項中也就是將龐大的檔名引數分離成單個檔案來處理,顯然就沒問題了。其實我在網上看到有朋友提醒,此命令在檔案中含有中文字元的時候可能依然會報錯,可以使用下面這條命令來解決:

Shell
1 find.-name"*"-execrm{}\;-print

好了,就這些了,其實所有的命令,網上都會有更詳細的介紹,俺記錄下來也只是起到一個提示作用,省的連自己都忘了什麼時候需要用到哪個命令。