Linux xargs 命令


xargs 是給命令傳遞參數的一個過濾器,也是組合多個命令的一個工具。php

xargs 能夠將管道或標準輸入(stdin)數據轉換成命令行參數,也可以從文件的輸出中讀取數據。linux

xargs 也能夠將單行或多行文本輸入轉換爲其餘格式,例如多行變單行,單行變多行。bash

xargs 默認的命令是 echo,這意味着經過管道傳遞給 xargs 的輸入將會包含換行和空白,不過經過 xargs 的處理,換行和空白將被空格取代。工具

xargs 是一個強有力的命令,它可以捕獲一個命令的輸出,而後傳遞給另一個命令。測試

之因此能用到這個命令,關鍵是因爲不少命令不支持|管道來傳遞參數,而平常工做中有有這個必要,因此就有了 xargs 命令,例如:url

find /sbin -perm +700 |ls -l #這個命令是錯誤的 find /sbin -perm +700 |xargs ls -l #這樣纔是正確的

xargs 通常是和管道一塊兒使用。spa

命令格式:命令行

somecommand |xargs -item command

參數:進程

  • -a file 從文件中讀入做爲sdtin
  • -e flag ,注意有的時候可能會是-E,flag必須是一個以空格分隔的標誌,當xargs分析到含有flag這個標誌的時候就中止。
  • -p 當每次執行一個argument的時候詢問一次用戶。
  • -n num 後面加次數,表示命令在執行的時候一次用的argument的個數,默認是用全部的。
  • -t 表示先打印命令,而後再執行。
  • -i 或者是-I,這得看linux支持了,將xargs的每項名稱,通常是一行一行賦值給 {},能夠用 {} 代替。
  • -r no-run-if-empty 當xargs的輸入爲空的時候則中止xargs,不用再去執行了。
  • -s num 命令行的最大字符數,指的是 xargs 後面那個命令的最大命令行字符數。
  • -L num 從標準輸入一次讀取 num 行送給 command 命令。
  • -l 同 -L。
  • -d delim 分隔符,默認的xargs分隔符是回車,argument的分隔符是空格,這裏修改的是xargs的分隔符。
  • -x exit的意思,主要是配合-s使用。。
  • -P 修改最大的進程數,默認是1,爲0時候爲as many as it can ,這個例子我沒有想到,應該平時都用不到的吧。

實例

xargs 用做替換工具,讀取輸入數據從新格式化後輸出。圖片

定義一個測試文件,內有多行文本數據:

# cat test.txt a b c d e f g h i j k l m n o p q r s t u v w x y z

多行輸入單行輸出:

# cat test.txt | xargs a b c d e f g h i j k l m n o p q r s t u v w x y z

-n 選項多行輸出:

# cat test.txt | xargs -n3 a b c d e f g h i j k l m n o p q r s t u v w x y z

-d 選項能夠自定義一個定界符:

# echo "nameXnameXnameXname" | xargs -dX name name name name

結合 -n 選項使用:

# echo "nameXnameXnameXname" | xargs -dX -n2 name name name name

讀取 stdin,將格式化後的參數傳遞給命令

假設一個命令爲 sk.sh 和一個保存參數的文件 arg.txt:

#!/bin/bash #sk.sh命令內容,打印出全部參數。 echo $*

arg.txt文件內容:

# cat arg.txt aaa bbb ccc

xargs 的一個選項 -I,使用 -I 指定一個替換字符串 {},這個字符串在 xargs 擴展時會被替換掉,當 -I 與 xargs 結合使用,每個參數命令都會被執行一次:

# cat arg.txt | xargs -I {} ./sk.sh -p {} -l -p aaa -l -p bbb -l -p ccc -l

複製全部圖片文件到 /data/images 目錄下:

ls *.jpg | xargs -n1 -I cp {} /data/images

xargs 結合 find 使用

用 rm 刪除太多的文件時候,可能獲得一個錯誤信息:/bin/rm Argument list too long. 用 xargs 去避免這個問題:

find . -type f -name "*.log" -print0 | xargs -0 rm -f

xargs -0 將 \0 做爲定界符。

統計一個源代碼目錄中全部 php 文件的行數:

find . -type f -name "*.php" -print0 | xargs -0 wc -l

查找全部的 jpg 文件,而且壓縮它們:

find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz

xargs 其餘應用

假如你有一個文件包含了不少你但願下載的 URL,你可以使用 xargs下載全部連接:

# cat url-list.txt | xargs wget -c
相關文章
相關標籤/搜索