您好,登錄后才能下訂單哦!
這篇文章的內容主要圍繞Linux系統xargs命令該怎么用進行講述,文章內容清晰易懂,條理清晰,非常適合新手學習,值得大家去閱讀。感興趣的朋友可以跟隨小編一起閱讀吧。希望大家通過這篇文章有所收獲!
在使用 Linux 時,你是否遇到過需要將一些命令串在一起,但是其中一個命令不接受管道輸入的情況呢?在這種情況下,我們就可以使用 xargs 命令。xargs 可以將一個命令的輸出作為參數發送給另一個命令。
在 Linux 中,所有標準的應用程序都有與之關聯的三個數據流。分別是標準輸入流(stdin),標準輸出流(stdout)和標準錯誤流(stderr)。這些流通過文本來運行,我們使用文本將輸入(stdin)發送到命令,然后響應(stdout)將會以文本形式顯示在終端窗口上。錯誤消息也以文本的形式顯示在終端窗口上(stderr)。
Linux 和類 Unix 操作系統的一大功能是可以將一個命令的標準輸出流傳遞到另一個命令的標準輸入流。第一個命令不會管它的輸出是否寫到了終端窗口,第二個命令也不會管它的輸入是否來自鍵盤。
雖然所有 Linux 命令都有三個標準流,但是并不是所有命令都接受另一個命令的標準輸出作為它的標準輸入流的輸入。因此我們無法通過管道將輸入傳給這些命令。
xargs是一個使用標準數據流構建執行管道的命令。通過使用xargs命令我們可以使 echo,rm 和 mkdir 等命令接受標準輸入作為它們的參數。
xargs接受管道輸入,也可以接受來自文件的輸入。xargs 使用該輸入作為我們指定的命令的參數。如果我們沒有給xargs指定特定的命令,則默認使用 echo。xargs 始終生成單行輸出,即使輸入的數據是多行的。
假如我們使用 ls 的 -1(每行列出一個文件)選項,則會得到一列文件名稱:
$ ls -1 ./*.sh
這一命令列出了當前目錄中的 Shell 腳本文件。
如果我們將輸出結果通過管道傳遞給 xargs ,會得到什么樣的效果?
$ ls -1 ./*.sh | xargs
可以看出來,輸出以一長串文本的形式寫到了終端上。由此可見,xargs 可以將輸出作為參數傳遞給其他命令。
我們可以使用 xargs 命令輕松地讓 wc 命令計算多個文件中的單詞數,字符數和行數
$ ls *.c | xargs wc
執行結果如下:
命令運行結果顯示了每個文件的統計信息以及總數。
這條命令執行了以下操作:
ls列出了所有的 .page 文件,并將該列表傳給了xargs。
xargs 將所有文件名傳遞給 wc。
wc 將這些文件名作為命令行參數進行處理。
我們可以使用 -p(交互)選項來讓 xargs 提示我們是否要進行下一步的操作。
如果我們通過 xargs 將一串文件名的字符串傳遞給 touch 命令,touch 將創建這些文件。
$ echo 'one two three' | xargs -p touch
終端上顯示將要執行的命令,xargs 等待我們輸入 y 或 Y ,n 或 N 并按 Enter 來響應。如果只按了 Enter ,則視為 n。只有當我們當輸入 y 或 Y 時才執行該命令。
我們按下y和 Enter ,然后使用ls用來檢查文件是否已經創建。
$ ls one two three
我們可以用-I(初始參數)選項來將 xargs 和多個命令一起使用。這一選項定義了替換字符串。在命令行中的任何出現替換字符串的位置,都會插入我們提供給 xargs 的值 。
有點抽象,我們以一個實例來進行講解。
我們先用 tree 命令查看當前目錄中的子目錄。該 -d(directory)選項使 tree 命令忽略文件,只輸出目錄。
$ tree -d
現在只有一個子目錄 images 。
在 directories.txt 這個文件中,我們有一些想要創建的目錄的名稱。我們先用 cat 查看其中的內容。
$ cat directories.txt
我們把這些內容作為輸入數據傳給 xargs ,執行以下的命令:
$ cat directories.txt | xargs -I % sh -c 'echo %; mkdir %'
這條命令執行了以下操作:
cat directories.txt :將 directrories.txt 文件的內容(所有要創建的目錄名稱)傳給 xargs。
xargs -I % :定義了替換字符串 %。
sh -c:啟動一個新的子shell。-c(commond)讓 shell 讀取命令。
‘echo %; mkdir %’:每個%都會被替換為 xargs 傳過來的目錄名稱 。echo命令打印目錄名稱,mkdir 命令創建目錄。
命令執行結果:
我們可以用 tree 驗證已創建是否已創建了目錄。
$ tree -d
我們可以使用 xargs 命令來用一個命令將文件復制到多個位置。
首先,通過管道將兩個目錄的名稱傳給 xargs 。并且讓 xargs 一次只將其中一個參數傳遞給正在使用的命令。
想要調用 cp 兩次,每次各使用兩個目錄中的一個作為命令行參數,我們可以通過將 xargs 的 -n(max number)選項設置為 1 來實現。
這里還使用了-v(verbose 詳細信息)選項,讓 cp 反饋正在執行的操作。
$ echo ~/dir1/ ~/dir2/ | xargs -n 1 cp -v ./*.c
我們將文件復制到了兩個目錄,一次復制一個目錄。cp 反饋了詳細信息,讓我們看到進行了哪些操作。
如果文件名中包含空格或者其他特殊字符(例如換行符),xargs 將無法正確解釋這些文件名。我們可以使用 -0(空終止符)選項來解決這一問題。此時, xargs 將使用 null 字符作為文件名最終的分隔符。
這里我們以 find 命令為例。find 有自己的選項來處理文件名中的空格和特殊字符,即 -print0(全名,空字符)選項。
$ find . -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}"
這一命令執行了以下操作:
find . -name “*.png” :find 將從當前目錄中搜索名稱和 *.png 相匹配的對象,type -f 指定了只搜索文件。
-print0:名稱將以空字符結尾,并且保留空格和特殊字符。
xargs -0:xargs 也將考慮文件名以空值結尾,并且空格和特殊字符不會引起問題。
rm -v -rf “{}”:rm 將反饋正在進行的操作(-v),遞歸進行操作(-r),不發送錯誤提示而直接刪除文件(-f)。每個文件名替換 “{}”。
命令執行之后,將搜索了所有子目錄,刪除了其中匹配的文件。
假設我們要刪除一組嵌套的子目錄,先用tree進行查看。
$ tree -d
$ find . -name "level_one" -type d -print0 | xargs -0 rm -v -rf "{}"
這條命令使用 find 在當前目錄中遞歸搜索,搜索的目標是名為 level_one 的目錄,然后將目錄名通過xargs傳遞給 rm 。
這個命令和前面的命令之間的區別是,搜索的項目是最頂層目錄的名稱,而且-type d說明要查找的目錄,而不是文件。
每個目錄的名稱都在刪除時打印出來。我們可以用tree再查看效果:
$ tree -d
所有嵌套的子目錄已刪除了。
我們可以使用 find ,xargs 和 rm 刪除所有類型的文件而只保留一種我們想要保留的類型的文件。這需要提供想要保留的文件類型。
-not 選項讓 find 返回所有與搜索模式不匹配的文件名。我們此時再次使用 xargs 的 -I (初始參數)選項。這次定義的替換字符串為 {} 。這和我們之前使用的替換字符串 % 的效果是相同的。
$ find . -type f -not -name "*.sh" -print0 | xargs -0 -I {} rm -v {}
命令執行之后,我們再通過 ls 來確認結果。可以看到,目錄中只剩下了與 *.sh 相匹配的文件。
$ ls -l
我們可以使用 find 命令來搜索文件,并通過 xargs 將文件名傳給 tar 命令來創建壓縮文件。
我們將在當前目錄中搜索 * .sh 文件。
$ find ./ -name "*.sh" -type f -print0 | xargs -0 tar -cvzf script_files.tar.gz
命令執行結果將列出了所有 .sh 文件,并創建了壓縮文件。
Linux的版本有:Deepin、UbuntuKylin、Manjaro、LinuxMint、Ubuntu等版本。其中Deepin是國內發展最好的Linux發行版之一;UbuntuKylin是基于Ubuntu的衍生發行版;Manjaro是基于Arch的Linux發行版;LinuxMint默認的Cinnamon桌面類似Windows XP簡單易用;Ubuntu則是以桌面應用為主的Linux操作系統。
感謝你的閱讀,相信你對“Linux系統xargs命令該怎么用”這一問題有一定的了解,快去動手實踐吧,如果想了解更多相關知識點,可以關注億速云網站!小編會繼續為大家帶來更好的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。