xargs可以將輸入內容(通常通過命令列管道傳遞),轉成後續命令的引數,通常用途有:
命令組合:尤其是一些命令不支援管道輸入,比如ls
。
避免引數過長:xargs可以通過-nx
來將引數分組,避免引數過長。
使用語法如下
usage: xargs [option]... command initial-args...
run command with arguments initial-args and more arguments read from input.
首先,建立測試檔案
touch a.js b.js c.js
接著,執行如下命令:
ls *.js | xargs ls -al
輸出如下:
-rw-r--r-- 1 a wheel 0 12 18 16:18 a.js
-rw-r--r-- 1 a wheel 0 12 18 16:18 b.js
-rw-r--r-- 1 a wheel 0 12 18 16:18 c.js
命令解釋:
首先,ls *.js
的輸出為a.js b.js c.js
。
通過管道,將a.js b.js c.js
作為xargs
的輸入引數。
xargs
命令收到輸入引數後,對引數進行解析,以空格/換行作為分隔符,拆分成多個引數,這裡變成a.js
、b.js
、c.js
。
xargs
將拆分後的引數,傳遞給後續的命令,作為後續命令的引數,也就是說,組成這樣的命令ls -al a.js b.js c.js
。
可以加上-t
引數,在執行後面的命令前,先將命令列印出來。
ls *.js | xargs -t ls -al
輸出如下,可以看到多了一行內容ls -al a.js b.js c.js
,這就是實際執行的命令。
ls -al a.js b.js c.js
-rw-r--r-- 1 a wheel 0 12 18 16:18 a.js
-rw-r--r-- 1 a wheel 0 12 18 16:18 b.js
-rw-r--r-- 1 a wheel 0 12 18 16:18 c.js
有的時候,我們需要用到原始的引數,可以通過引數-i
或-i
實現。引數說明如下
-i r same as --replace=r (r must be specified)
-i,--replace=[r] replace r in initial arguments with names
read from standard input. if r is
unspecified, assume {}
例子如下,將所有的.js
結尾的檔案,都加上.backup
字尾。-i '{}'
表示將後面命令列的{}
替換成前面解析出來的引數。
ls *.js | xargs -t -i '{}' mv {} {}.backup
展開後的命令如下:
mv a.js a.js.backup
mv b.js b.js.backup
mv c.js c.js.backup
命令列對引數最大長度有限制,xargs通過-nx
對引數進行分組來解決這個問題。
首先,建立4個檔案用來做實驗。
touch a.js b.js c.js d.js
然後執行如下命令:
ls *.js | xargs -t -n2 ls -al
輸出如下,-n2
表示,將引數以2個為一組,傳給後面的命令。
ls -al a.js b.js
-rw-r--r-- 1 root root 0 dec 18 16:52 a.js
-rw-r--r-- 1 root root 0 dec 18 16:52 b.js
ls -al c.js d.js
-rw-r--r-- 1 root root 0 dec 18 16:52 c.js
-rw-r--r-- 1 root root 0 dec 18 16:52 d.js
有的時候,檔名可能存在特殊字元,比如下面的檔名中存在空格。
touch 'hello 01.css' 'hello 02.css'
執行之前的命令會報錯,因為xargs
是以空格/換行作為分隔符,於是就會出現預期之外的行為。
# 命令
find . -name '*.css' | xargs -t ls -al
#輸出ls -al ./hello 01.css ./hello 02.css # 展開後的命令
ls: cannot access ./hello: no such file or directory
ls: cannot access 01.css: no such file or directory
ls: cannot access ./hello: no such file or directory
ls: cannot access 02.css: no such file or directory
xargs
是這樣解決這個問題的。
-print0
:告訴find
命令,在輸出檔名之後,跟上null
字元,而不是換行符;
-0
:告訴xargs
,以null
作為引數分隔符;
find . -name '*.css' -print0 | xargs -0 -t ls -al
將7天前的日誌備份到特定目錄
find . -mtime +7 | xargs -i '{}' mv {} /tmp/otc-svr-logs/
linux基礎命令之xargs
xargs build andexecute command lines from standard input 將前一條命令的輸出,可以當作後一條命令的引數。這個命令主要是和別的命令 如 find grep sed等 聯合使用,功能更強大 引數 0當sdtin含有特殊字元時候,將其當成一般字元,想...
linux過濾命令 xargs
xargs命令是給其他命令傳遞引數的乙個過濾器,也是組合多個命令的乙個工具。它擅長將標準輸入資料轉換成命令列引數,xargs能夠處理管道或者stdin並將其轉換成特定命令的命令引數。xargs也可以將單行或多行文字輸入轉換為其他格式,例如多行變單行,單行變多行。xargs的預設命令是echo,空格是...
linux命令詳解 xargs
1.簡介 之所以能用到這個命令,關鍵是由於很多命令不支援 管道來傳遞引數,而日常工作中有有這個必要,所以就有了 xargs 命令,例如 find sbin perm 700 ls l 這個命令是錯誤的 find sbin perm 700 xargs ls l 這樣才是正確的 xargs 可以讀入 ...