xargs 命令教程

xargs 命令教程

轉自:http://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html

作者: 阮一峰

日期: 2019年8月 8日

xargs是 Unix 系統的一個很有用的命令,但是常常被忽視,很多人不了解它的用法。

本文介紹如何使用這個命令。

img

一、標準輸入與管道命令

Unix 命令都帶有參數,有些命令可以接受"標準輸入"(stdin)作為參數。

$ cat /etc/passwd | grep root

上面的代碼使用了管道命令(|)。管道命令的作用,是將左側命令(cat /etc/passwd)的標準輸出轉換為標準輸入,提供給右側命令(grep root)作為參數。

因為grep命令可以接受標準輸入作為參數,所以上面的代碼等同于下面的代碼。

$ grep root /etc/passwd

但是,大多數命令都不接受標準輸入作為參數,只能直接在命令行輸入參數,這導致無法用管道命令傳遞參數。舉例來說,echo命令就不接受管道傳參。

$ echo "hello world" | echo

上面的代碼不會有輸出。因為管道右側的echo不接受管道傳來的標準輸入作為參數。

二、xargs 命令的作用

xargs命令的作用,是將標準輸入轉為命令行參數。

$ echo "hello world" | xargs echo
hello world

上面的代碼將管道左側的標準輸入,轉為命令行參數hello world,傳給第二個echo命令。

xargs命令的格式如下。

$ xargs [-options] [command]

真正執行的命令,緊跟在xargs后面,接受xargs傳來的參數。

xargs的作用在于,大多數命令(比如rmmkdirls)與管道一起使用時,都需要xargs將標準輸入轉為命令行參數。

$ echo "one two three" | xargs mkdir

上面的代碼等同于mkdir one two three。如果不加xargs就會報錯,提示mkdir缺少操作參數。

三、xargs 的單獨使用

xargs后面的命令默認是echo

$ xargs
# 等同于
$ xargs echo

大多數時候,xargs命令都是跟管道一起使用的。但是,它也可以單獨使用。

輸入xargs按下回車以后,命令行就會等待用戶輸入,作為標準輸入。你可以輸入任意內容,然后按下Ctrl d,表示輸入結束,這時echo命令就會把前面的輸入打印出來。

$ xargs
hello (Ctrl + d)
hello

再看一個例子。

$ xargs find -name
"*.txt"
./foo.txt
./hello.txt

上面的例子輸入xargs find -name以后,命令行會等待用戶輸入所要搜索的文件。用戶輸入"*.txt",表示搜索當前目錄下的所有 TXT 文件,然后按下Ctrl d,表示輸入結束。這時就相當執行find -name *.txt

四、-d 參數與分隔符

默認情況下,xargs將換行符和空格作為分隔符,把標準輸入分解成一個個命令行參數。

$ echo "one two three" | xargs mkdir

上面代碼中,mkdir會新建三個子目錄,因為xargsone two three分解成三個命令行參數,執行mkdir one two three

-d參數可以更改分隔符。

$ echo -e "a\tb\tc" | xargs -d "\t" echo
a b c

上面的命令指定制表符\t作為分隔符,所以a\tb\tc就轉換成了三個命令行參數。echo命令的-e參數表示解釋轉義字符。

五、-p 參數,-t 參數

使用xargs命令以后,由于存在轉換參數過程,有時需要確認一下到底執行的是什么命令。

-p參數打印出要執行的命令,詢問用戶是否要執行。

$ echo 'one two three' | xargs -p touch
touch one two three ?...

上面的命令執行以后,會打印出最終要執行的命令,讓用戶確認。用戶輸入y以后(大小寫皆可),才會真正執行。

-t參數則是打印出最終要執行的命令,然后直接執行,不需要用戶確認。

$ echo 'one two three' | xargs -t rm
rm one two three

六、-0 參數與 find 命令

由于xargs默認將空格作為分隔符,所以不太適合處理文件名,因為文件名可能包含空格。

find命令有一個特別的參數-print0,指定輸出的文件列表以null分隔。然后,xargs命令的-0參數表示用null當作分隔符。

$ find /path -type f -print0 | xargs -0 rm

上面命令刪除/path路徑下的所有文件。由于分隔符是null,所以處理包含空格的文件名,也不會報錯。

還有一個原因,使得xargs特別適合find命令。有些命令(比如rm)一旦參數過多會報錯"參數列表過長",而無法執行,改用xargs就沒有這個問題,因為它對每個參數執行一次命令。

$ find . -name "*.txt" | xargs grep "abc"

上面命令找出所有 TXT 文件以后,對每個文件搜索一次是否包含字符串abc

七、-L 參數

如果標準輸入包含多行,-L參數指定多少行作為一個命令行參數。

$ xargs find -name
"*.txt"   
"*.md"
find: paths must precede expression: `*.md'

上面命令同時將"*.txt"*.md兩行作為命令行參數,傳給find命令導致報錯。

使用-L參數,指定每行作為一個命令行參數,就不會報錯。

$ xargs -L 1 find -name
"*.txt"
./foo.txt
./hello.txt
"*.md"
./README.md

上面命令指定了每一行(-L 1)作為命令行參數,分別運行一次命令(find -name)。

下面是另一個例子。

$ echo -e "a\nb\nc" | xargs -L 1 echo
a
b
c

上面代碼指定每行運行一次echo命令,所以echo命令執行了三次,輸出了三行。

八、-n 參數

-L參數雖然解決了多行的問題,但是有時用戶會在同一行輸入多項。

$ xargs find -name
"*.txt" "*.md"
find: paths must precede expression: `*.md'

上面的命令將同一行的兩項作為命令行參數,導致報錯。

-n參數指定每次將多少項,作為命令行參數。

$ xargs -n 1 find -name

上面命令指定將每一項(-n 1)標準輸入作為命令行參數,分別執行一次命令(find -name)。

下面是另一個例子。

$ echo {0..9} | xargs -n 2 echo
0 1
2 3
4 5
6 7
8 9

上面命令指定,每兩個參數運行一次echo命令。所以,10個阿拉伯數字運行了五次echo命令,輸出了五行。

九、-I 參數

如果xargs要將命令行參數傳給多個命令,可以使用-I參數。

-I指定每一項命令行參數的替代字符串。

$ cat foo.txt
one
two
three$ cat foo.txt | xargs -I file sh -c 'echo file; mkdir file'
one 
two
three$ ls 
one two three

上面代碼中,foo.txt是一個三行的文本文件。我們希望對每一項命令行參數,執行兩個命令(echomkdir),使用-I file表示file是命令行參數的替代字符串。執行命令時,具體的參數會替代掉echo file; mkdir file里面的兩個file

十、–max-procs 參數

xargs默認只用一個進程執行命令。如果命令要執行多次,必須等上一次執行完,才能執行下一次。

--max-procs參數指定同時用多少個進程并行執行命令。--max-procs 2表示同時最多使用兩個進程,--max-procs 0表示不限制進程數。

$ docker ps -q | xargs -n 1 --max-procs 0 docker kill

上面命令表示,同時關閉盡可能多的 Docker 容器,這樣運行速度會快很多。

十一、參考鏈接

  • Linux and Unix xargs command tutorial with examples, George Ornbo
  • 8 Practical Examples of Linux Xargs Command for Beginners, Himanshu Arora

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532766.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532766.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532766.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android strictmode有什么作用,Android 性能優化 之 StrictMode

8種機械鍵盤軸體對比本人程序員,要買一個寫代碼的鍵盤,請問紅軸和茶軸怎么選?StrictMode概述StrictMode 是用來檢測程序中違例情況的開發者工具。使用StrictMode,系統檢測出主線程違例的情況會做出相應的反應,如日志打…

curl 的用法指南

curl 的用法指南 轉自:http://www.ruanyifeng.com/blog/2019/09/curl-reference.html 作者: 阮一峰 日期: 2019年9月 5日 簡介 curl 是常用的命令行工具,用來請求 Web 服務器。它的名字就是客戶端(client&#xf…

怎么在html顯示已登錄狀態,jQuery Ajax 實現在html頁面實時顯示用戶登錄狀態

當網站是全靜態的html頁面時,而又希望網站會員在登錄之后并在所有頁面頭部顯示登錄狀態,如用戶名等,如果未登錄就是未登錄狀態,下面給大家來分享實現的方法。一、在html靜態頁面中加入div,并指定ID如:二、新…

互斥鎖、條件變量、信號量淺析

互斥鎖、條件變量、信號量淺析 互斥鎖與條件變量 條件變量是為了保證同步 條件變量用在多線程多任務同步的,一個線程完成了某一個動作就通過條件變量告訴別的線程,別的線程再進行某些動作(大家都在semtake的時候,就阻塞在哪里&a…

xpwifi熱點設置android,教你在XP電腦中開啟設置WiFi熱點使用的步驟

對于系統中網絡的連接問題是最重要的,那在處理不同的錯誤的情況中,對于無線網絡的設置也就是我們說的WiFi的使用也是會遇到問題的,那在操作的時候對于電腦中是怎么實現設置WiFi熱點的的,對于這個問題今天小編就來跟大家分享一下教…

C/C++ 指針詳解

指針詳解 參考視頻:https://www.bilibili.com/video/BV1bo4y1Z7xf/,感謝Bilibilifengmuzi2003的搬運翻譯及后續勘誤,也感謝已故原作者Harsha Suryanarayana的講解,RIP。 學習完之后,回看找特定的知識點,善…

android雙聯動列表,Android Fragment實現列表和內容聯動

在平板上經常能看到這種的情況:左邊是一個列表,右邊是列表項對應的內容,當點擊某一個列表時,右邊內容區也會隨之改變。下面使用fragment簡單的demo:思路:在mainactivity定義一個回調接口,并在列…

linux /proc 詳解

linux /proc 詳解 本文整理了一下 linux /proc下的幾個常用的目錄和文件,可供查閱,之后在學習工作中有別的用到的話會再補充。 /proc 簡介 Linux系統上的/proc目錄是一種文件系統,即proc文件系統。與其它常見的文件系統不同的是&#xff0…

android模擬器太卡,安卓模擬器安裝之后太卡怎么解決

用安卓模擬器玩游戲原理就是在電腦上安裝了一部手機,如果你的電腦配置不是非常高,能不卡頓嗎?遇到卡頓怎么解決?1、安裝最新版本的顯卡驅動。逍遙模擬器對于顯卡的性能要求很高,因此升級至最新版本的顯卡驅動,是確保逍遙模擬器流…

編程環境中Runtime(運行時)的三個含義

編程環境中Runtime(運行時)的三個含義 轉自:https://www.zhihu.com/question/20607178 知乎答主doodlewind 三個含義 實際上編程語境中的 runtime 至少有三個含義,分別是: 指「程序運行的時候」,即程序…

非常不錯的一款html5【404頁面】,不含js腳本可以左右擺動,原生JavaScript實現日歷功能代碼實例(無引用Jq)...

這篇文章主要介紹了原生JavaScript實現日歷功能代碼實例(無引用Jq),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下成品顯示,可左右切換月份html 代碼移動端日歷日一二三四五六css代碼*{margin: 0;pa…

12 [虛擬化] 進程抽象;fork,execve,exit

12 [虛擬化] 進程抽象;fork,execve,exit 南京大學操作系統課蔣炎巖老師網絡課程筆記。 視頻:https://www.bilibili.com/video/BV1N741177F5?p12 講義:http://jyywiki.cn/OS/2021/slides/8.slides#/ 本講概述 回到“…

計算機應用與基礎實踐怎么考,自考計算機基礎應用科目筆試和實踐性考試怎么考...

自考計算機基礎應用科目筆試和實踐性考試怎么考? 報考自考的考生有些專業的考生會在自己的課程科目中發現計算機基礎應用不僅有理論知識考試還有實踐性考試,那么自考計算機基礎應用科目的筆試和實踐性考試怎么考?自考計算機基礎應用科目筆試怎…

14 [虛擬化] 虛存抽象;Linux進程的地址空間

14 [虛擬化] 虛存抽象;Linux進程的地址空間 南京大學操作系統課蔣炎巖老師網絡課程筆記。 視頻:https://www.bilibili.com/video/BV1N741177F5?p14 講義:http://jyywiki.cn/OS/2021/slides/10.slides#/ 本講概述 程序 狀態機;…

瀏覽器是指在用戶計算機上,自考《網頁設計與制作》測試題及答案

自考《網頁設計與制作》測試題及答案學習是一個不斷積累的過程,為幫助考生們更好地復習《與制作》科目知識點,以下是搜索整理的一份自考《網頁設計與制作》測試題及答案,供參考練習,希望對大家有所幫助!想了解更多相關信息請持續關…

Ubuntu 18.04 安裝OpenCV C++

Ubuntu 18.04 安裝OpenCV C 構建并安裝 僅構建核心模塊 # 更新并安裝依賴 # 更新并安裝依賴 sudo apt update && sudo apt install -y cmake g wget unzip# 下載并解壓包 wget -O opencv.zip https://github.com/opencv/opencv/archive/master.zip unzip opencv.zip…

html計算x的y,HTML5畫布:旋轉時計算x,y點

我開發了一個HTML5 Canvas應用程序,它涉及到讀取一個xml文件,該文件描述了需要在畫布上繪制的箭頭,直形和其他形狀的位置。的XML布局的HTML5畫布:旋轉時計算x,y點實施例:如果對象被旋轉它涉及計算一個點的位…

(2021) 20 [虛擬化] 進程調度

(2021) 20 [虛擬化] 進程調度 南京大學操作系統課蔣炎巖老師網絡課程筆記。 視頻:https://www.bilibili.com/video/BV1HN41197Ko?p20 講義:http://jyywiki.cn/OS/2021/slides/11.slides#/ 背景 — 機制與策略分離 機制:一個通用的、可定制…

計算機組裝過程英文版,計算機組裝與維護試題及答案(國外英文資料).doc

計算機組裝與維護試題及答案(國外英文資料)計算機組裝與維護試題及答案(國外英文資料)(1) choiceIn the following equipment, the input device is (b)A. b. b. c. c. c. d. d.In Windows 98, the combination of CTRL Alt Del is (c)A. cold start b. heat start c. interr…

make命令及makefile

make命令及makefile 轉自:https://www.ruanyifeng.com/blog/2015/02/make.html Make 命令教程 作者: 阮一峰 日期: 2015年2月20日 代碼變成可執行文件,叫做編譯(compile);先編譯這個&#…