linux xargs命令,xargs 命令教程
xargs是 Unix 系統(tǒng)的一個(gè)很有用的命令,但是常常被忽視,很多人不了解它的用法。
本文介紹如何使用這個(gè)命令。
一、標(biāo)準(zhǔn)輸入與管道命令
Unix 命令都帶有參數(shù),有些命令可以接受"標(biāo)準(zhǔn)輸入"(stdin)作為參數(shù)。
$ cat /etc/passwd | grep root
上面的代碼使用了管道命令(|)。管道命令的作用,是將左側(cè)命令(cat /etc/passwd)的標(biāo)準(zhǔn)輸出轉(zhuǎn)換為標(biāo)準(zhǔn)輸入,提供給右側(cè)命令(grep root)作為參數(shù)。
因?yàn)間rep命令可以接受標(biāo)準(zhǔn)輸入作為參數(shù),所以上面的代碼等同于下面的代碼。
$ grep root /etc/passwd
但是,大多數(shù)命令都不接受標(biāo)準(zhǔn)輸入作為參數(shù),只能直接在命令行輸入?yún)?shù),這導(dǎo)致無法用管道命令傳遞參數(shù)。舉例來說,echo命令就不接受管道傳參。
$ echo "hello world" | echo
上面的代碼不會(huì)有輸出。因?yàn)楣艿烙覀?cè)的echo不接受管道傳來的標(biāo)準(zhǔn)輸入作為參數(shù)。
二、xargs 命令的作用
xargs命令的作用,是將標(biāo)準(zhǔn)輸入轉(zhuǎn)為命令行參數(shù)。
$ echo "hello world" | xargs echo
hello world
上面的代碼將管道左側(cè)的標(biāo)準(zhǔn)輸入,轉(zhuǎn)為命令行參數(shù)hello world,傳給第二個(gè)echo命令。
xargs命令的格式如下。
$ xargs [-options] [command]
真正執(zhí)行的命令,緊跟在xargs后面,接受xargs傳來的參數(shù)。
xargs的作用在于,大多數(shù)命令(比如rm、mkdir、ls)與管道一起使用時(shí),都需要xargs將標(biāo)準(zhǔn)輸入轉(zhuǎn)為命令行參數(shù)。
$ echo "one two three" | xargs mkdir
上面的代碼等同于mkdir one two three。如果不加xargs就會(huì)報(bào)錯(cuò),提示mkdir缺少操作參數(shù)。
三、xargs 的單獨(dú)使用
xargs后面的命令默認(rèn)是echo。
$ xargs
# 等同于
$ xargs echo
大多數(shù)時(shí)候,xargs命令都是跟管道一起使用的。但是,它也可以單獨(dú)使用。
輸入xargs按下回車以后,命令行就會(huì)等待用戶輸入,作為標(biāo)準(zhǔn)輸入。你可以輸入任意內(nèi)容,然后按下Ctrl d,表示輸入結(jié)束,這時(shí)echo命令就會(huì)把前面的輸入打印出來。
$ xargs
hello (Ctrl + d)
hello
再看一個(gè)例子。
$ xargs find -name
"*.txt"
./foo.txt
./hello.txt
上面的例子輸入xargs find -name以后,命令行會(huì)等待用戶輸入所要搜索的文件。用戶輸入"*.txt",表示搜索當(dāng)前目錄下的所有 TXT 文件,然后按下Ctrl d,表示輸入結(jié)束。這時(shí)就相當(dāng)執(zhí)行find -name *.txt。
四、-d 參數(shù)與分隔符
默認(rèn)情況下,xargs將換行符和空格作為分隔符,把標(biāo)準(zhǔn)輸入分解成一個(gè)個(gè)命令行參數(shù)。
$ echo "one two three" | xargs mkdir
上面代碼中,mkdir會(huì)新建三個(gè)子目錄,因?yàn)閤args將one two three分解成三個(gè)命令行參數(shù),執(zhí)行mkdir one two three。
-d參數(shù)可以更改分隔符。
$ echo -e "a\tb\tc" | xargs -d "\t" echo
a b c
上面的命令指定制表符\t作為分隔符,所以a\tb\tc就轉(zhuǎn)換成了三個(gè)命令行參數(shù)。echo命令的-e參數(shù)表示解釋轉(zhuǎn)義字符。
五、-p 參數(shù),-t 參數(shù)
使用xargs命令以后,由于存在轉(zhuǎn)換參數(shù)過程,有時(shí)需要確認(rèn)一下到底執(zhí)行的是什么命令。
-p參數(shù)打印出要執(zhí)行的命令,詢問用戶是否要執(zhí)行。
$ echo 'one two three' | xargs -p touch
touch one two three ?...
上面的命令執(zhí)行以后,會(huì)打印出最終要執(zhí)行的命令,讓用戶確認(rèn)。用戶輸入y以后(大小寫皆可),才會(huì)真正執(zhí)行。
-t參數(shù)則是打印出最終要執(zhí)行的命令,然后直接執(zhí)行,不需要用戶確認(rèn)。
$ echo 'one two three' | xargs -t rm
rm one two three
六、-0 參數(shù)與 find 命令
由于xargs默認(rèn)將空格作為分隔符,所以不太適合處理文件名,因?yàn)槲募赡馨崭瘛?/p>
find命令有一個(gè)特別的參數(shù)-print0,指定輸出的文件列表以null分隔。然后,xargs命令的-0參數(shù)表示用null當(dāng)作分隔符。
$ find /path -type f -print0 | xargs -0 rm
上面命令刪除/path路徑下的所有文件。由于分隔符是null,所以處理包含空格的文件名,也不會(huì)報(bào)錯(cuò)。
還有一個(gè)原因,使得xargs特別適合find命令。有些命令(比如rm)一旦參數(shù)過多會(huì)報(bào)錯(cuò)"參數(shù)列表過長",而無法執(zhí)行,改用xargs就沒有這個(gè)問題,因?yàn)樗鼘γ總€(gè)參數(shù)執(zhí)行一次命令。
$ find . -name "*.txt" | xargs grep "abc"
上面命令找出所有 TXT 文件以后,對每個(gè)文件搜索一次是否包含字符串a(chǎn)bc。
七、-L 參數(shù)
如果標(biāo)準(zhǔn)輸入包含多行,-L參數(shù)指定多少行作為一個(gè)命令行參數(shù)。
$ xargs find -name
"*.txt"
"*.md"
find: paths must precede expression: `*.md'
上面命令同時(shí)將"*.txt"和*.md兩行作為命令行參數(shù),傳給find命令導(dǎo)致報(bào)錯(cuò)。
使用-L參數(shù),指定每行作為一個(gè)命令行參數(shù),就不會(huì)報(bào)錯(cuò)。
$ xargs -L 1 find -name
"*.txt"
./foo.txt
./hello.txt
"*.md"
./README.md
上面命令指定了每一行(-L 1)作為命令行參數(shù),分別運(yùn)行一次命令(find -name)。
下面是另一個(gè)例子。
$ echo -e "a\nb\nc" | xargs -L 1 echo
a
b
c
上面代碼指定每行運(yùn)行一次echo命令,所以echo命令執(zhí)行了三次,輸出了三行。
八、-n 參數(shù)
-L參數(shù)雖然解決了多行的問題,但是有時(shí)用戶會(huì)在同一行輸入多項(xiàng)。
$ xargs find -name
"*.txt" "*.md"
find: paths must precede expression: `*.md'
上面的命令將同一行的兩項(xiàng)作為命令行參數(shù),導(dǎo)致報(bào)錯(cuò)。
-n參數(shù)指定每次將多少項(xiàng),作為命令行參數(shù)。
$ xargs -n 1 find -name
上面命令指定將每一項(xiàng)(-n 1)標(biāo)準(zhǔn)輸入作為命令行參數(shù),分別執(zhí)行一次命令(find -name)。
下面是另一個(gè)例子。
$ echo {0..9} | xargs -n 2 echo
0 1
2 3
4 5
6 7
8 9
上面命令指定,每兩個(gè)參數(shù)運(yùn)行一次echo命令。所以,10個(gè)阿拉伯?dāng)?shù)字運(yùn)行了五次echo命令,輸出了五行。
九、-I 參數(shù)
如果xargs要將命令行參數(shù)傳給多個(gè)命令,可以使用-I參數(shù)。
-I指定每一項(xiàng)命令行參數(shù)的替代字符串。
$ cat foo.txt
one
two
three
$ cat foo.txt | xargs -I file sh -c 'echo file; mkdir file'
one
two
three
$ ls
one two three
上面代碼中,foo.txt是一個(gè)三行的文本文件。我們希望對每一項(xiàng)命令行參數(shù),執(zhí)行兩個(gè)命令(echo和mkdir),使用-I file表示file是命令行參數(shù)的替代字符串。執(zhí)行命令時(shí),具體的參數(shù)會(huì)替代掉echo file; mkdir file里面的兩個(gè)file。
十、--max-procs 參數(shù)
xargs默認(rèn)只用一個(gè)進(jìn)程執(zhí)行命令。如果命令要執(zhí)行多次,必須等上一次執(zhí)行完,才能執(zhí)行下一次。
--max-procs參數(shù)指定同時(shí)用多少個(gè)進(jìn)程并行執(zhí)行命令。--max-procs 2表示同時(shí)最多使用兩個(gè)進(jìn)程,--max-procs 0表示不限制進(jìn)程數(shù)。
$ docker ps -q | xargs -n 1 --max-procs 0 docker kill
上面命令表示,同時(shí)關(guān)閉盡可能多的 Docker 容器,這樣運(yùn)行速度會(huì)快很多。
十一、參考鏈接
(完)
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的linux xargs命令,xargs 命令教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux找回rm的文件夹,Linux
- 下一篇: linux6如何分区,CentOS6.9