在Linux上使用xargs命令的詳細(xì)教程
大家好,我是良許。
在使用 Linux 時(shí),你是否遇到過(guò)需要將一些命令串在一起,但是其中一個(gè)命令不接受管道輸入的情況呢?在這種情況下,我們就可以使用 xargs
命令。xargs
可以將一個(gè)命令的輸出作為參數(shù)發(fā)送給另一個(gè)命令。
在 Linux 中,所有標(biāo)準(zhǔn)的應(yīng)用程序都有與之關(guān)聯(lián)的三個(gè)數(shù)據(jù)流。分別是標(biāo)準(zhǔn)輸入流(stdin),標(biāo)準(zhǔn)輸出流(stdout)和標(biāo)準(zhǔn)錯(cuò)誤流(stderr)。這些流通過(guò)文本來(lái)運(yùn)行,我們使用文本將輸入(stdin)發(fā)送到命令,然后響應(yīng)(stdout)將會(huì)以文本形式顯示在終端窗口上。錯(cuò)誤消息也以文本的形式顯示在終端窗口上(stderr)。
Linux 和類 Unix 操作系統(tǒng)的一大功能是可以將一個(gè)命令的標(biāo)準(zhǔn)輸出流傳遞到另一個(gè)命令的標(biāo)準(zhǔn)輸入流。第一個(gè)命令不會(huì)管它的輸出是否寫到了終端窗口,第二個(gè)命令也不會(huì)管它的輸入是否來(lái)自鍵盤。
雖然所有 Linux 命令都有三個(gè)標(biāo)準(zhǔn)流,但是并不是所有命令都接受另一個(gè)命令的標(biāo)準(zhǔn)輸出作為它的標(biāo)準(zhǔn)輸入流的輸入。因此我們無(wú)法通過(guò)管道將輸入傳給這些命令。
xargs
是一個(gè)使用標(biāo)準(zhǔn)數(shù)據(jù)流構(gòu)建執(zhí)行管道的命令。通過(guò)使用xargs
命令我們可以使 echo
,rm
和 mkdir
等命令接受標(biāo)準(zhǔn)輸入作為它們的參數(shù)。
xargs命令
xargs
接受管道輸入,也可以接受來(lái)自文件的輸入。xargs
使用該輸入作為我們指定的命令的參數(shù)。如果我們沒(méi)有給xargs
指定特定的命令,則默認(rèn)使用 echo
。xargs
始終生成單行輸出,即使輸入的數(shù)據(jù)是多行的。
假如我們使用 ls
的 -1
(每行列出一個(gè)文件)選項(xiàng),則會(huì)得到一列文件名稱:
$ ls -1 ./*.sh
這一命令列出了當(dāng)前目錄中的 Shell 腳本文件。
如果我們將輸出結(jié)果通過(guò)管道傳遞給 xargs
,會(huì)得到什么樣的效果?
$ ls -1 ./*.sh | xargs
可以看出來(lái),輸出以一長(zhǎng)串文本的形式寫到了終端上。由此可見(jiàn),xargs
可以將輸出作為參數(shù)傳遞給其他命令。
配合wc命令使用xargs
我們可以使用 xargs
命令輕松地讓 wc
命令計(jì)算多個(gè)文件中的單詞數(shù),字符數(shù)和行數(shù)
$ ls *.c | xargs wc
執(zhí)行結(jié)果如下:
命令運(yùn)行結(jié)果顯示了每個(gè)文件的統(tǒng)計(jì)信息以及總數(shù)。
這條命令執(zhí)行了以下操作:
ls
列出了所有的 .page 文件,并將該列表傳給了xargs
。xargs
將所有文件名傳遞給 wc
。wc
將這些文件名作為命令行參數(shù)進(jìn)行處理。
使用帶有確認(rèn)消息的xargs
我們可以使用 -p
(交互)選項(xiàng)來(lái)讓 xargs
提示我們是否要進(jìn)行下一步的操作。
如果我們通過(guò) xargs
將一串文件名的字符串傳遞給 touch
命令,touch
將創(chuàng)建這些文件。
$ echo 'one two three' | xargs -p touch
終端上顯示將要執(zhí)行的命令,xargs
等待我們輸入 y
或 Y
,n
或 N
并按 Enter 來(lái)響應(yīng)。如果只按了 Enter
,則視為 n
。只有當(dāng)我們當(dāng)輸入 y
或 Y
時(shí)才執(zhí)行該命令。
我們按下y
和 Enter ,然后使用ls
用來(lái)檢查文件是否已經(jīng)創(chuàng)建。
$ ls one two three
將xargs與多個(gè)命令一起使用
我們可以用-I
(初始參數(shù))選項(xiàng)來(lái)將 xargs
和多個(gè)命令一起使用。這一選項(xiàng)定義了替換字符串
。在命令行中的任何出現(xiàn)替換字符串的位置,都會(huì)插入我們提供給 xargs
的值 。
有點(diǎn)抽象,我們以一個(gè)實(shí)例來(lái)進(jìn)行講解。
我們先用 tree
命令查看當(dāng)前目錄中的子目錄。該 -d
(directory)選項(xiàng)使 tree
命令忽略文件,只輸出目錄。
$ tree -d
現(xiàn)在只有一個(gè)子目錄 images 。
在 directories.txt 這個(gè)文件中,我們有一些想要?jiǎng)?chuàng)建的目錄的名稱。我們先用 cat
查看其中的內(nèi)容。
$ cat directories.txt
我們把這些內(nèi)容作為輸入數(shù)據(jù)傳給 xargs
,執(zhí)行以下的命令:
$ cat directories.txt | xargs -I % sh -c 'echo %; mkdir %'
這條命令執(zhí)行了以下操作:
cat directories.txt :將 directrories.txt 文件的內(nèi)容(所有要?jiǎng)?chuàng)建的目錄名稱)傳給 xargs
。xargs -I % :定義了替換字符串 %
。sh -c:?jiǎn)?dòng)一個(gè)新的子shell。-c
(commond)讓 shell 讀取命令。'echo %; mkdir %':每個(gè)%
都會(huì)被替換為 xargs
傳過(guò)來(lái)的目錄名稱 。echo
命令打印目錄名稱,mkdir
命令創(chuàng)建目錄。
命令執(zhí)行結(jié)果:
我們可以用 tree
驗(yàn)證已創(chuàng)建是否已創(chuàng)建了目錄。
$ tree -d
將文件復(fù)制到多個(gè)位置
我們可以使用 xargs
命令來(lái)用一個(gè)命令將文件復(fù)制到多個(gè)位置。
首先,通過(guò)管道將兩個(gè)目錄的名稱傳給 xargs
。并且讓 xargs
一次只將其中一個(gè)參數(shù)傳遞給正在使用的命令。
想要調(diào)用 cp
兩次,每次各使用兩個(gè)目錄中的一個(gè)作為命令行參數(shù),我們可以通過(guò)將 xargs
的 -n
(max number)選項(xiàng)設(shè)置為 1 來(lái)實(shí)現(xiàn)。
這里還使用了-v
(verbose 詳細(xì)信息)選項(xiàng),讓 cp
反饋正在執(zhí)行的操作。
$ echo ~/dir1/ ~/dir2/ | xargs -n 1 cp -v ./*.c
我們將文件復(fù)制到了兩個(gè)目錄,一次復(fù)制一個(gè)目錄。cp
反饋了詳細(xì)信息,讓我們看到進(jìn)行了哪些操作。
刪除嵌套目錄中的文件
如果文件名中包含空格或者其他特殊字符(例如換行符),xargs
將無(wú)法正確解釋這些文件名。我們可以使用 -0
(空終止符)選項(xiàng)來(lái)解決這一問(wèn)題。此時(shí), xargs
將使用 null
字符作為文件名最終的分隔符。
這里我們以 find
命令為例。find
有自己的選項(xiàng)來(lái)處理文件名中的空格和特殊字符,即 -print0
(全名,空字符)選項(xiàng)。
$ find . -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}"
這一命令執(zhí)行了以下操作:
find . -name “*.png” :find
將從當(dāng)前目錄中搜索名稱和 *.png 相匹配的對(duì)象,type -f
指定了只搜索文件。-print0:名稱將以空字符結(jié)尾,并且保留空格和特殊字符。xargs -0:xargs
也將考慮文件名以空值結(jié)尾,并且空格和特殊字符不會(huì)引起問(wèn)題。rm -v -rf "{}":rm
將反饋正在進(jìn)行的操作(-v
),遞歸進(jìn)行操作(-r),不發(fā)送錯(cuò)誤提示而直接刪除文件(-f
)。每個(gè)文件名替換 "{}"。
命令執(zhí)行之后,將搜索了所有子目錄,刪除了其中匹配的文件。
刪除嵌套目錄
假設(shè)我們要?jiǎng)h除一組嵌套的子目錄,先用tree
進(jìn)行查看。
$ tree -d
$ find . -name "level_one" -type d -print0 | xargs -0 rm -v -rf "{}"
這條命令使用 find 在當(dāng)前目錄中遞歸搜索,搜索的目標(biāo)是名為 level_one 的目錄,然后將目錄名通過(guò)xargs
傳遞給 rm
。
這個(gè)命令和前面的命令之間的區(qū)別是,搜索的項(xiàng)目是最頂層目錄的名稱,而且-type d
說(shuō)明要查找的目錄,而不是文件。
每個(gè)目錄的名稱都在刪除時(shí)打印出來(lái)。我們可以用tree
再查看效果:
$ tree -d
所有嵌套的子目錄已刪除了。
刪除一種文件類型以外的所有文件
我們可以使用 find
,xargs
和 rm
刪除所有類型的文件而只保留一種我們想要保留的類型的文件。這需要提供想要保留的文件類型。
-not
選項(xiàng)讓 find
返回所有與搜索模式不匹配的文件名。我們此時(shí)再次使用 xargs
的 -I
(初始參數(shù))選項(xiàng)。這次定義的替換字符串為 {}
。這和我們之前使用的替換字符串 %
的效果是相同的。
$ find . -type f -not -name "*.sh" -print0 | xargs -0 -I {} rm -v {}
命令執(zhí)行之后,我們?cè)偻ㄟ^(guò) ls
來(lái)確認(rèn)結(jié)果??梢钥吹?,目錄中只剩下了與 *.sh
相匹配的文件。
$ ls -l
使用Xargs創(chuàng)建壓縮文件
我們可以使用 find
命令來(lái)搜索文件,并通過(guò) xargs
將文件名傳給 tar
命令來(lái)創(chuàng)建壓縮文件。
我們將在當(dāng)前目錄中搜索 * .sh
文件。
$ find ./ -name "*.sh" -type f -print0 | xargs -0 tar -cvzf script_files.tar.gz
命令執(zhí)行結(jié)果將列出了所有 .sh 文件,并創(chuàng)建了壓縮文件。
總結(jié)
到此這篇關(guān)于如何在Linux上使用xargs命令的文章就介紹到這了,更多相關(guān)Linux上使用xargs命令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
跨域請(qǐng)求 Apache 服務(wù)器配置的方法
這篇文章主要介紹了跨域請(qǐng)求 Apache 服務(wù)器配置的方法,包括修改服務(wù)器配置文件的方法和如何編輯httpd.conf。接下來(lái),通過(guò)本文給大家重點(diǎn)講解,需要的朋友參考下吧2017-01-01CentOS7修改服務(wù)器系統(tǒng)時(shí)間的方法
服務(wù)器上的系統(tǒng)時(shí)間不對(duì),比實(shí)際的UTC快了將近63分鐘。在這里小編給大家分享下系統(tǒng)時(shí)間更正的過(guò)程,對(duì)centos修改服務(wù)器時(shí)間的知識(shí)感興趣的朋友參考下吧2016-10-10基于python的Linux系統(tǒng)指定進(jìn)程性能監(jiān)控思路詳解
這篇文章主要介紹了基于python的Linux系統(tǒng)指定進(jìn)程性能監(jiān)控的思路詳解,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09linux云服務(wù)搭建七日殺服務(wù)器的詳細(xì)流程
這篇文章主要介紹了linux云服務(wù)搭建七日殺服務(wù)器的詳細(xì)流程,本文通過(guò)實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08詳解firewall的規(guī)則設(shè)置與命令(白名單設(shè)置)
這篇文章主要介紹了詳解firewall的規(guī)則設(shè)置與命令(白名單設(shè)置),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11linux ubuntu中安裝、卸載和刪除python-igraph的方法教程
igraph是一個(gè)進(jìn)行圖計(jì)算和社交網(wǎng)絡(luò)分析的軟件包,支持python語(yǔ)言。下面這篇文章主要給大家介紹了關(guān)于在linux ubuntu中安裝、卸載和刪除python-igraph的方法教程,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-11-11