Unix
命令都帶有參數(shù),有些命令可以接受”標(biāo)準(zhǔn)輸入(stdin)”作為參數(shù)。而管道命令(|)的作用,是將左側(cè)命令的標(biāo)準(zhǔn)輸出轉(zhuǎn)換為標(biāo)準(zhǔn)輸入,提供給右側(cè)命令作為參數(shù)使用。雖然,在 Unix 系統(tǒng)中大多數(shù)命令都不接受標(biāo)準(zhǔn)輸入作為參數(shù),只能直接在命令行輸入?yún)?shù),這導(dǎo)致無法用管道命令傳遞參數(shù)。比如,我們?nèi)粘J褂玫?echo 命令就不接受管道傳參。而 xargs 命令的作用,就是將標(biāo)準(zhǔn)輸入轉(zhuǎn)為命令行參數(shù)。
xargs基本用法
# grep命令接受管道傳參
> cat /etc/passwd | grep root
# echo命令不接受管道傳參
> echo "hello rumenz" | echo
# 將標(biāo)準(zhǔn)輸入轉(zhuǎn)為命令行參數(shù)
> echo "hello rumenz" | xargs echo
hello rumenz
需要注意的是 xargs 后面的默認(rèn)跟的是 echo 命令,所以它可以單獨(dú)使用。
-d
指定分隔符,默認(rèn)使用空格分割
# 空格作為分隔符
$ echo "one two three" | xargs mkdir
# 指定制表符 作為分隔符
$ echo -e "a b c" | xargs -d " " echo
a b c
-p
打印出要執(zhí)行的命令并詢問用戶是否要執(zhí)行
> echo 'one two three' | xargs -p touch
touch one tow three ?...y
-0
表示用 null 當(dāng)作分隔符
find命令有一個(gè)特別的參數(shù)-print0,用來指定輸出的文件列表以null作為分隔符
> find /path -type f -print0 | xargs -0 rm
指定多少行作為一個(gè)命令行參數(shù)
> xargs -L 1 find -name
"*.txt"
./1.txt
./rumenz.txt
./2.txt
./3.txt
-n
指定每次將多少項(xiàng)作為命令行參數(shù)
> echo {0..9} | xargs -n 2 echo
指定每一項(xiàng)命令行參數(shù)的替代字符串
# 將命令行參數(shù)傳給多個(gè)命令
> cat foo.txt
one
two
three
> cat foo.txt | xargs -I {} sh -c 'echo {}; mkdir {}'
one
two
three
> ls
one two three
將多行輸入轉(zhuǎn)換成單行輸入
> cat rumenz.txt
1 2 3 4
5 6
7 8 9
> cat rumenz.txt | xargs
1 2 3 4 5 6 7 8 9
將單行文本轉(zhuǎn)換成多行
> cat rumenz.txt
1 2 3 4 5 6 7 8 9
> cat rumenz.txt | xargs -n 3
1 2 3
4 5 6
7 8 9
指定分隔符進(jìn)行行轉(zhuǎn)換
> echo "rumenz:123:rumenz:456:rumenz:789" | xargs -d : -n 2
rumenz 123
rumenz 456
rumenz 789
xargs和find結(jié)合
> find . -type f -name "*.txt" -print | xargs rm -f
批量下載文件
> cat rumenz.txt | xargs wget -c
原文鏈接:https://rumenz.com/rumenbiji/linux-xargs-skills.html
微信公眾號(hào):入門小站
本文摘自 :https://blog.51cto.com/u