unix 命令都帶有引數,有些命令可以接受"標準輸入"(stdin)作為引數。
$ cat /etc/passwd | grep root
上面的**使用了管道命令(|)。管道命令的作用,是將左側命令(cat /etc/passwd)的標準輸出轉換為標準輸入,提供給右側命令(grep root)作為引數。
因為grep命令可以接受標準輸入作為引數,所以上面的**等同於下面的**。
grep root /etc/passwd
但是,大多數命令都不接受標準輸入作為引數,只能直接在命令列輸入引數,這導致無法用管道命令傳遞引數。舉例來說,echo命令就不接受管道傳參。如下
$ echo "hello world" | echo
xargs命令的作用,是將標準輸入轉為命令列引數。
$ echo "hello world" | xargs echo
hello world
上面的**將管道左側的標準輸入,轉為命令列引數hello world,傳給第二個echo命令。
xargs命令的格式如下。
$ xargs [-options] [command]
真正執行的命令,緊跟在xargs後面,接受xargs傳來的引數。
xargs的作用在於,大多數命令(比如rm、mkdir、ls)與管道一起使用時,都需要xargs將標準輸入轉為命令列引數。
如下
$ echo "one two three" | xargs mkdir
上面的**等同於mkdir one two three。如果不加xargs就會報錯,提示mkdir缺少操作引數。
xargs後面的命令預設是echo
$ xargs
# 等同於
$ xargs echo
大多數時候,xargs命令都是跟管道一起使用的。但是,它也可以單獨使用。
輸入xargs按下回車以後,命令列就會等待使用者輸入,作為標準輸入。你可以輸入任意內容,然後按下ctrl d,表示輸入結束,這時echo命令就會把前面的輸入列印出來。
$ xargs
hello (ctrl + d)
hello
$ xargs find -name
"*.txt"
./foo.txt
./hello.txt
上面的例子輸入xargs find -name以後,命令行會等待使用者輸入所要搜尋的檔案。使用者輸入"*.txt",表示搜尋當前目錄下的所有 txt 檔案,然後按下ctrl d,表示輸入結束。這時就相當執行find -name *.txt。
預設情況下,xargs將換行符和空格作為分隔符,把標準輸入分解成乙個個命令列引數。
$ echo "one two three" | xargs mkdir
上面**中,mkdir會新建三個子目錄,因為xargs將one two three分解成三個命令列引數,執行mkdir one two three。
-d引數可以更改分隔符。
$ echo -e "a\tb\tc" | xargs -d "\t" echo
a b c
上面的命令指定製表符\t作為分隔符,所以a\tb\tc就轉換成了三個命令列引數。echo命令的-e引數表示解釋轉義字元。
使用xargs命令以後,由於存在轉換引數過程,有時需要確認一下到底執行的是什麼命令。
-p引數列印出要執行的命令,詢問使用者是否要執行。
$ echo 'one two three' | xargs -p touch
touch one two three ?...
上面的命令執行以後,會列印出最終要執行的命令,讓使用者確認。使用者輸入y以後(大小寫皆可),才會真正執行。
-t引數則是列印出最終要執行的命令,然後直接執行,不需要使用者確認。
$ echo 'one two three' | xargs -t rm
rm one two three
由於xargs預設將空格作為分隔符,所以不太適合處理檔名,因為檔名可能包含空格。
find命令有乙個特別的引數-print0,指定輸出的檔案列表以null分隔。然後,xargs命令的-0引數表示用null當作分隔符。
$ find /path -type f -print0 | xargs -0 rm
上面命令刪除/path路徑下的所有檔案。由於分隔符是null,所以處理包含空格的檔名,也不會報錯。
還有乙個原因,使得xargs特別適合find命令。有些命令(比如rm)一旦引數過多會報錯"引數列表過長",而無法執行,改用xargs就沒有這個問題,因為它對每個引數執行一次命令。
$ find . -name "*.txt" | xargs grep "abc"
上面命令找出所有 txt 檔案以後,對每個檔案搜尋一次是否包含字串abc。
如果標準輸入包含多行,-l引數指定多少行作為乙個命令列引數。
$ xargs find -name
"*.txt"
"*.md"
find: paths must precede expression: `*.md'
上面命令同時將".txt"和.md兩行作為命令列引數,傳給find命令導致報錯。
使用-l引數,指定每行作為乙個命令列引數,就不會報錯。
$ xargs -l 1 find -name
"*.txt"
./foo.txt
./hello.txt
"*.md"
./readme.md
上面命令指定了每一行(-l 1)作為命令列引數,分別執行一次命令(find -name)。
下面是另乙個例子。
$ echo -e "a\nb\nc" | xargs -l 1 echoab
c
上面**指定每行執行一次echo命令,所以echo命令執行了三次,輸出了三行。
-l引數雖然解決了多行的問題,但是有時使用者會在同一行輸入多項。
$ xargs find -name
"*.txt" "*.md"
find: paths must precede expression: `*.md'
上面的命令將同一行的兩項作為命令列引數,導致報錯。
-n引數指定每次將多少項,作為命令列引數。
$ xargs -n 1 find -name
上面命令指定將每一項(-n 1)標準輸入作為命令列引數,分別執行一次命令(find -name)。
下面是另乙個例子。
$ echo | xargs -n 2 echo
0 12 3
4 56 7
8 9
上面命令指定,每兩個引數執行一次echo命令。所以,10個阿拉伯數字執行了五次echo命令,輸出了五行。
如果xargs要將命令列引數傳給多個命令,可以使用-i引數。
-i指定每一項命令列引數的替代字串。
$ cat foo.txt
onetwo
three
$ cat foo.txt | xargs -i file sh -c 'echo file; mkdir file'
one
twothree
$ ls
one two three
上面**中,foo.txt是乙個三行的文字檔案。我們希望對每一項命令列引數,執行兩個命令(echo和mkdir),使用-i file表示file是命令列引數的替代字串。執行命令時,具體的引數會替代掉echo file; mkdir file裡面的兩個file。
–max-procs引數指定同時用多少個程序並行執行命令。–max-procs 2表示同時最多使用兩個程序,–max-procs 0表示不限制程序數。
$ docker ps -q | xargs -n 1 --max-procs 0 docker kill
上面命令表示,同時關閉盡可能多的 docker 容器,這樣執行速度會快很多。 Linux 基礎教程 42 xargs命令
xargs是execute arguments的縮寫,主要作用是從標準輸入中讀取內容,並將此內容傳遞給它要協助的命令,並作為要協助命令的引數來執行。基本語法 xargs 選項 命令 其常用選項如下 選項說明 null 0 允許將null作為分隔符 a file 從檔案讀取項而非標準輸入 d deli...
高階命令 xargs命令
xargs命令 linux 命令大全 xargs 英文全拼 extended arguments 是給命令傳遞引數的乙個過濾器,也是組合多個命令的乙個工具。xargs 可以將管道或標準輸入 stdin 資料轉換成命令列引數,也能夠從檔案的輸出中讀取資料。xargs 也可以將單行或多行文字輸入轉換為其...
xargs筆記 xargs和mv配合
將所有子目錄裡的txt檔案移動到當前目錄。d installer 2 321.txt 新建資料夾 1.txt 新建資料夾 fds.txtfind mindepth 2 name txt xargs i file mv file 原理 find命令便令當前目錄,通過 mindepth 2排除當前層級。...