Linux基礎 xargs命令

2021-09-08 05:06:34 字數 3396 閱讀 4600

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.jsb.jsc.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 可以讀入 ...