需要將一些Linux命令串在一起,但其中一個不接受管道輸入?xargs可以獲取一個命令的輸出,並將其作為引數傳送到另一個命令。
所有標準Linux實用程式都有三個與之相關聯的資料流。它們是標準輸入流(stdin)、標準輸出流(stdout)和標準錯誤流(stderr)。
這些流處理文字。我們使用文字向命令傳送輸入(stdin),響應(stdout)作為文字寫入終端視窗。錯誤訊息也作為文字(stderr)寫入終端視窗。
Linux和類Unix作業系統的一個重要特性是能夠將一個命令的stdout輸出透過管道傳輸到第二個命令的stdin輸入。第一個命令不關心它的輸出是否沒有傳送到終端視窗,第二個命令不關心它的輸入是否來自鍵盤。
儘管所有的Linux命令都有三個標準流,但並不是所有的命令都接受另一個命令的stdout作為其stdin的輸入。這意味著你不能透過管道輸入到它們。
xargs是使用標準資料流構建執行管道的命令。透過使用xargs,我們可以使echo、rm和mkdir等命令接受標準輸入作為引數。
xargs將接受管道輸入。它還可以接受來自檔案的輸入。xargs將該輸入用作命令的引數,我們已經告訴它要處理這些命令。如果我們不告訴xargs使用特定的命令,它將預設使用echo。
我們可以用它來演示xargs如何總是生成一行輸出,即使是從多行輸入。
如果將-1(每行列出一個檔案)選項與ls一起使用,則會得到一列檔名。
ls -1 ./*.sh這將列出當前目錄中的shell指令碼檔案。
我們得到了一個預期的列。如果我們把它透過沙爾格管,我們能得到什麼?
ls -1 ./*.sh | xargs輸出作為一個長文字流寫入終端視窗。
正是這個功能讓xargs將引數輸入到其他命令中。
我們可以使用xargs輕鬆地讓wc計算多個檔案中的單詞、字元和行。
ls *.page | xargs wc事情就是這樣:
每個檔案的統計資訊與總體總數一起顯示。
我們可以使用-p(互動式)選項讓xargs提示我們確認我們很高興它繼續進行。
如果我們透過xargs傳遞一個檔名字串給touch,touch將為我們建立檔案。
echo 'one two three' | xargs -p touch將顯示要執行的命令,xargs透過鍵入“y”或“y”、或“n”或“n”並按Enter鍵等待我們做出響應。
如果您只需按Enter鍵,它將被視為“n”。僅當鍵入“y”或“y”時才執行該命令。
我們按“y”鍵,然後按回車鍵。我們可以使用ls檢查檔案是否已建立。
ls one two three透過使用-I(初始引數)選項,我們可以對xargs使用多個命令。
此選項定義一個“替換字串”。只要替換字串的標記出現在命令列中,就會**提供給xargs的值。
讓我們使用tree命令檢視當前目錄中的子目錄。-d(directory)選項使樹忽略檔案,只報告目錄。
tree -d只有一個子目錄叫做“images”
在一個名為“的檔案中”目錄.txt,我們有一些希望建立的目錄的名稱。我們可以用cat檢視它的內容。
cat directories.txt我們將使用它作為xargs的輸入資料。我們的命令是:
cat directories.txt | xargs -I % sh -c 'echo %; mkdir %'這種情況如下:
目錄被逐一列出。
我們可以再次使用tree來驗證目錄是否已建立。
tree -d我們可以使用xargs來允許我們用一個命令將檔案複製到多個位置。
我們將把兩個目錄的名稱作為輸入引數匯入xargs。我們將告訴xargs一次只將這些引數中的一個傳遞給它正在使用的命令。
在本例中,命令是cp。因此效果是呼叫cp兩次,每次呼叫兩個目錄中的一個作為命令列引數。允許這種情況發生的xargs引數是-n(max number)選項。我們要把這個設定成一個。
我們還在cp中使用-v(verbose)選項,以便它報告正在發生的事情。
echo ~/Backups/ ~/Documents/page-files/ | xargs -n 1 cp -v ./*.page檔案被複制到兩個目錄,一次一個目錄。cp報告每個檔案複製操作,以便我們可以看到它們的發生。
如果檔名中有空格和奇怪的字元(如換行符),xargs將無**確解釋它們。我們可以透過使用-0(空終止符)選項來克服這個問題。這告訴xargs使用空字元作為檔名的最終分隔符。
我們將在這個例子中使用find。find有自己的選項來處理檔名中的空白和奇怪字元。它是-print0(全名,空字元)選項。
find . -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}"這種情況如下:
將搜尋所有子目錄,並刪除與搜尋模式匹配的檔案。
假設我們要刪除一組巢狀的子目錄。樹會讓我們看到它們的。
tree -dfind . -name "level_one" -type d printo | xargs -o rm -v -rf "{}"此命令將使用find在當前目錄中遞迴搜尋。搜尋目標是一個名為“level\ u one”的目錄。目錄名透過xargs傳遞給rm。
此命令與上一個命令之間唯一重要的更改是,搜尋項是最頂層目錄的名稱,-type d告訴find查詢目錄,而不是檔案。
每個目錄的名稱在刪除時打印出來。我們可以用tree檢查:
tree -d所有巢狀的子目錄都將被刪除。
我們可以使用find、xargs和rm刪除除要保留的型別之外的所有檔案。這有點違反直覺,但我們提供了希望保留的檔案型別的名稱,而不是要刪除的檔案型別的名稱。
not選項告訴find返回與搜尋模式不匹配的檔名。我們再次對xargs使用-I(初始引數)選項。這次我們定義的替換字串標記是“{}”。這與我們之前生成的replace string令牌的行為完全相同,它恰好是一個“%”。
find . -type f -not - name "*.sh" -print0 | xargs -0 -I {} rm -v {}我們可以和ls核實一下。目錄中只剩下與“*.sh”搜尋模式匹配的檔案。
ls -l我們可以使用find來搜尋檔案,並將它們透過xargs傳遞給tar,從而建立一個歸檔檔案。
我們要在當前目錄中搜索。搜尋模式是“*.page”,所以我們要查詢“.page”檔案。
find ./ - name "*.page" -type f -print0 | xargs -0 -tar -cvzf page_files.tar.gz在建立存檔檔案時,將按預期列出這些檔案。
有時你需要一個小腳手架當你把東西堆在一起。xargs架起了可以輸出資訊的命令和不能接收資訊的命令之間的橋樑。
xargs和find都有大量的選項。我們鼓勵您檢視他們的手冊頁以瞭解更多資訊。
... 在本文中,我將向您展示如何在Linux上安裝、執行和使用PowerShell! ...
...許您在Android裝置上安裝誠實善良的Linux應用程式。下面是如何使用Termux應用程式。 ...
... 如何在windows10上安裝linux bash shell ...
要在Linux中重新命名檔案嗎?如果您知道如何在Windows、macOS或Chrome作業系統中完成這項工作,那麼您就知道如何在這裡完成這項工作。在大多數版本的Linux上,您只需右鍵單擊一個檔案並選擇Rename選項。 ...
想在Linux系統上新增使用者但不知道如何新增?在Linux上使用命令列介面管理使用者無疑是一項複雜的工作。而對於初學者來說,即使新增新使用者也是一場噩夢。 ...
...版本可以讓您對安全更新做出重要決定。我們將向您展示如何找到這些,無論您使用哪個發行版。 滾動和點釋放 你知道你在執行哪個版本的Linux嗎?你能找到核心版本嗎?Linux的滾動發行版,如Arch、Manjaro和openSUSE,經常使用自...
...在和以前一樣具有分裂性。儘管許多主要的Linux發行版都使用它,但鐵桿反對者並沒有鬆懈。 linux引導序列 開啟計算機電源後,硬體將引導,然後(根據計算機使用的引導扇區型別)執行主引導記錄(MBR)或執行統一可擴充套...
...複您過去執行的命令。一旦您瞭解了Linux history命令以及如何使用它,它就可以顯著地提高您的生產效率。 操縱歷史 正如喬治桑塔亞納(georgestantayana)的一句名言:“那些記不住過去的人註定要重蹈覆轍。”不幸的是,在Linux...