xargs的简单解析
生活随笔
收集整理的這篇文章主要介紹了
xargs的简单解析
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
根據(jù)《Linux與unix shell編程指南》第2章對xargs解析如下:xargs的作用是用來回避對命令行長度的限制,它通過使用一個參數(shù)多次調(diào)用一個命令實(shí)現(xiàn)這一功能,而不是一次使用多個參數(shù)
。這句話的意思是:xargs永遠(yuǎn)一次只傳給他后面的命令一個參數(shù),然后不停的將所有參數(shù)一一傳完.
其實(shí)這個解析我覺得系錯的,等陣再證明“
==============分割線=============
一個簡單的應(yīng)用如下:bash-3.00$ lsa.log ?a.txt ?b.log ?b.txt ?c.log ?c.txtbash-3.00$ ls | xargs rm ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ---------(刪除全部文件)bash-3.00$ lsbash-3.00$?
上面第3行命令意思就是把ls得到的結(jié)果 輸出給 后面的命令rm,作為rm的參數(shù).
也就是說,上面的命令執(zhí)行相當(dāng)于:rm a.log ?a.txt ?b.log ?b.txt ?c.log ?c.txt
==============分割線=============下面證明這句話是錯的:xargs永遠(yuǎn)一次只傳給他后面的命令一個參數(shù),然后不停的將所有參數(shù)一一傳完
看如下例子bash-3.00$ ls -ltotal 2-rw-r--r-- ? 1 o475110 ?u_gtsusr ? ? ? 0 Nov 23 11:10 a-rw-r--r-- ? 1 o475110 ?u_gtsusr ? ? ? 0 Nov 23 11:11 bdrwxr-xr-x ? 2 o475110 ?u_gtsusr ? ? 512 Nov 23 11:11 c_folder ? ? ? ? ?(當(dāng)前目錄下有a b兩個文件,和c_folder 這個文件夾)bash-3.00$ ls -l c_folder/total 0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (c_folder 文件夾是空的) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?bash-3.00$ ls ? ? ?a ? ? ? ? b ? ? ? ? c_folder ? ? ? ? ? ? ?(ls出來的輸出)bash-3.00$ ls |xargs cp ? ? ? ? ? ?(執(zhí)行命令)bash-3.00$ ls ? ? ? ? ? ? ? ? ? ? ? ? ?a ? ? ? ? b ? ? ? ? c_folder ? ? ? ? ? ? ?(當(dāng)前目錄沒變化)bash-3.00$ ls c_folder/ ? ? ? ? ? ?(把a(bǔ) 和 b copy到了c_folder下)a ?bbash-3.00$?
可以看出:ls |xargs cp ?這個命令 相當(dāng)于執(zhí)行了 cp a b c_folder ? ? (把 a b copy 到c_folder),而不是把 a b c_folder這3個參數(shù)一次一次地傳給cp而是把ls的輸出 一次過交給xargs后面的命令cp,作為cp的參數(shù)。
==============分割線=============那么如何將參數(shù)1個1個地傳給xargs 后面的命令呢
起始xargs 有1個參數(shù)-n-n number ? ? ? Invokes utility using as many standard inputarguments as possible, up to number (a posi-tive ?decimal ?integer) ?arguments ?maximum.Fewer arguments will be used if:
o ?The ?command ?line ?length ?accumulatedexceeds ?the ?size ?specified by the -soption (or {LINE_MAX} if there is no -soption), or
o ?The ?last ?iteration ?has ?fewer ? thannumber, ?but not zero, operands remain-ing.
能指定每一次指定多少個參數(shù)給xargs后面的命令:
例子:bash-3.00$ ls ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#當(dāng)前目錄下有a b c d 4個文件夾 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??a ?b ?c ?dbash-3.00$ ls | xargs echo ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #默認(rèn)不帶參數(shù)的話, 管線前面的參數(shù)是一次過傳給echo的a b c dbash-3.00$ ls | xargs -n 1 echo ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#這次逐個傳給echo了。 所以echo 了4次, 有4行abcdbash-3.00$ ls | xargs -n 2 echo ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#每次傳2個參數(shù)給echo , echo 了 2次。a bc dbash-3.00$?
==============分割線=============這里介紹另1個很有用的參數(shù)i-i[replstr] ? ? This option is equivalent to -I replstr. Thestring ?{} ?is ?assumed ?for ?replstr if theoption-argument is omitted
意思是 xargs 加上 -i 參數(shù)后, 能用{} 代表管線前面的輸出。接上面的例子:例如我想cp a b c d 到另1個文件夾../e
如果用ls | xargs cp -r ../e 是不行的因?yàn)橄喈?dāng)于執(zhí)行了 cp -r ../e a b c d ... ? ? ?#吧 ../e a b c 這個4個文件copy 到 d
用 ls | xargs -i ?cp {} ../e ?就ok了因?yàn)閧} 就代表了前面ls的輸出, 就是a b c d 了啊~
。這句話的意思是:xargs永遠(yuǎn)一次只傳給他后面的命令一個參數(shù),然后不停的將所有參數(shù)一一傳完.
其實(shí)這個解析我覺得系錯的,等陣再證明“
==============分割線=============
一個簡單的應(yīng)用如下:bash-3.00$ lsa.log ?a.txt ?b.log ?b.txt ?c.log ?c.txtbash-3.00$ ls | xargs rm ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ---------(刪除全部文件)bash-3.00$ lsbash-3.00$?
可以睇出xargs的功能:它將輸入 輸出給xargs后面的命令,作為那個命令的參數(shù)。
上面第3行命令意思就是把ls得到的結(jié)果 輸出給 后面的命令rm,作為rm的參數(shù).
也就是說,上面的命令執(zhí)行相當(dāng)于:rm a.log ?a.txt ?b.log ?b.txt ?c.log ?c.txt
==============分割線=============下面證明這句話是錯的:xargs永遠(yuǎn)一次只傳給他后面的命令一個參數(shù),然后不停的將所有參數(shù)一一傳完
看如下例子bash-3.00$ ls -ltotal 2-rw-r--r-- ? 1 o475110 ?u_gtsusr ? ? ? 0 Nov 23 11:10 a-rw-r--r-- ? 1 o475110 ?u_gtsusr ? ? ? 0 Nov 23 11:11 bdrwxr-xr-x ? 2 o475110 ?u_gtsusr ? ? 512 Nov 23 11:11 c_folder ? ? ? ? ?(當(dāng)前目錄下有a b兩個文件,和c_folder 這個文件夾)bash-3.00$ ls -l c_folder/total 0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (c_folder 文件夾是空的) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?bash-3.00$ ls ? ? ?a ? ? ? ? b ? ? ? ? c_folder ? ? ? ? ? ? ?(ls出來的輸出)bash-3.00$ ls |xargs cp ? ? ? ? ? ?(執(zhí)行命令)bash-3.00$ ls ? ? ? ? ? ? ? ? ? ? ? ? ?a ? ? ? ? b ? ? ? ? c_folder ? ? ? ? ? ? ?(當(dāng)前目錄沒變化)bash-3.00$ ls c_folder/ ? ? ? ? ? ?(把a(bǔ) 和 b copy到了c_folder下)a ?bbash-3.00$?
可以看出:ls |xargs cp ?這個命令 相當(dāng)于執(zhí)行了 cp a b c_folder ? ? (把 a b copy 到c_folder),而不是把 a b c_folder這3個參數(shù)一次一次地傳給cp而是把ls的輸出 一次過交給xargs后面的命令cp,作為cp的參數(shù)。
==============分割線=============那么如何將參數(shù)1個1個地傳給xargs 后面的命令呢
起始xargs 有1個參數(shù)-n-n number ? ? ? Invokes utility using as many standard inputarguments as possible, up to number (a posi-tive ?decimal ?integer) ?arguments ?maximum.Fewer arguments will be used if:
o ?The ?command ?line ?length ?accumulatedexceeds ?the ?size ?specified by the -soption (or {LINE_MAX} if there is no -soption), or
o ?The ?last ?iteration ?has ?fewer ? thannumber, ?but not zero, operands remain-ing.
能指定每一次指定多少個參數(shù)給xargs后面的命令:
例子:bash-3.00$ ls ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#當(dāng)前目錄下有a b c d 4個文件夾 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??a ?b ?c ?dbash-3.00$ ls | xargs echo ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #默認(rèn)不帶參數(shù)的話, 管線前面的參數(shù)是一次過傳給echo的a b c dbash-3.00$ ls | xargs -n 1 echo ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#這次逐個傳給echo了。 所以echo 了4次, 有4行abcdbash-3.00$ ls | xargs -n 2 echo ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#每次傳2個參數(shù)給echo , echo 了 2次。a bc dbash-3.00$?
==============分割線=============這里介紹另1個很有用的參數(shù)i-i[replstr] ? ? This option is equivalent to -I replstr. Thestring ?{} ?is ?assumed ?for ?replstr if theoption-argument is omitted
意思是 xargs 加上 -i 參數(shù)后, 能用{} 代表管線前面的輸出。接上面的例子:例如我想cp a b c d 到另1個文件夾../e
如果用ls | xargs cp -r ../e 是不行的因?yàn)橄喈?dāng)于執(zhí)行了 cp -r ../e a b c d ... ? ? ?#吧 ../e a b c 這個4個文件copy 到 d
用 ls | xargs -i ?cp {} ../e ?就ok了因?yàn)閧} 就代表了前面ls的輸出, 就是a b c d 了啊~
總結(jié)
以上是生活随笔為你收集整理的xargs的简单解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一些常见的Find 命令
- 下一篇: 解决ubuntu Gvim 菜单乱码