linux xargs命令一(與find ls等命令組合)(轉)


-p 操作具有可交互性,每次執行comand都交互式提示用戶選擇

-i -i 選項告訴 xargs 可以使用{}代替傳遞過來的參數, 建議使用-I,其符合POSIX標准

-I 

 格式: xargs  -I  rep-str  comand  rep-srt             rep-str 為代替傳遞給xargs參數, 可以使 {} $ @ 等符號 ,其主要作用是當xargs   command 后有多個參數時,調整參數位置。例如:

          find  . -name  "*.txt "  |xargs -I {}  cp {} /tmp   
---------------------
作者:千年的塔
來源:CSDN
原文:https://blog.csdn.net/hittata/article/details/8021500
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

 

xargs是給命令傳遞參數的一個過濾器,也是組合多個命令的一個工具。它把一個數據流分割為一些足夠小的塊,以方便過濾器和命令進行處理。通常情況下,xargs從管道或者stdin中讀取數據,但是它也能夠從文件的輸出中讀取數據。xargs的默認命令是echo,這意味着通過管道傳遞給xargs的輸入將會包含換行和空白,不過通過xargs的處理,換行和空白將被空格取代。

 

    在使用 find命令的-exec選項處理匹配到的文件時, find命令將所有匹配到的文件一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鍾之后,就會出現溢出錯誤。錯誤信息通常是“參數列太長”或“參數列溢出”。這就是xargs命令的用處所在,特別是與find命令一起使用。  

find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是全部,不像-exec選項那樣。這樣它可以先處理最先獲取的一部分文件,然后是下一批,並如此繼續下去。  

 

xargs 是一個強有力的命令,它能夠捕獲一個命令的輸出,然后傳遞給另外一個命令。

 

xargs  [-0prtx] [-E  eof-str] [-e[eof-str]] [--eof[=eof-str]] [--null]

       [-d delimiter] [--delimiter delimiter]  [-I  replace-str]  [-i[replace-

       str]] [--replace[=replace-str]]   [-l[max-lines]]   [-L   max-lines]

       [--max-lines[=max-lines]] [-n max-args] [--max-args=max-args] [-s  max-

       chars]  [--max-chars=max-chars] [-P max-procs] [--max-procs=max-procs]

       [--interactive]     [--verbose]     [--exit]   [--no-run-if-empty]

       [--arg-file=file]   [--show-limits]   [--version]   [--help]   [command

       [initial-arguments]]

 

最經典應用模式:  somecommand |xargs -item  command   

不帶command ,默認的使用echo 輸出

[root@auc-test2 log]# find ./eccs/ -name "*2" |xargs
./eccs/eccs.log.2 ./eccs/eccs.log.12
  

用途:

    1.構造參數列表並運行命令,即將接收的參數傳遞給后面的command 命令執行

    2.將多行輸入轉換為單行 (特殊功效)

優點:

       1. 將輸入參數整理后,去除<newline>換行符,以一個列表形式處理

       2. 避免參數過長引發的問題,使用xargs -n 參數適當控制,對於經常產生大量輸出的命令如find、locate和grep來說非常有用

XARGS 一般是和管道一起使用: 

XXcomand  | xargs  -x  comand initial-args

-x 代表選項

選項:

 

-p 操作具有可交互性,每次執行comand都交互式提示用戶選擇

 

-i 選項告訴 xargs 可以使用{}代替傳遞過來的參數, 建議使用-I,其符合POSIX標准

 

-I  格式: xargs  -I  rep-str  comand  rep-srt    rep-str 為代替傳遞給xargs參數, 可以使 {} $ @ 等符號 ,其主要作用是當xargs   command 后有多個參數時,調整參數位置。例如:

          find  . -name  "*.txt "  |xargs -I {}  cp {} /tmp   

 

[root@eccs_web client]# find ./ -name '*.doc' | xargs -I {} cp {} /hu
等價於
[root@eccs_web client]# find ./ -name '*.doc' | xargs -i cp {} /hu  
 

-t    啟用命令行輸出模式:其先回顯要運行的命令,然后執行命令,打印出命令結果,跟蹤與調試xargs的利器,也是研究xargs運行原理的好辦法;

 

[root@auc-test2 log]# find ./eccs/ -name "*2" |xargs -t ls -l
ls -l ./eccs/eccs.log.2 ./eccs/eccs.log.12
-rw-r--r-- 1 root root 10485916 12月 17 17:34 ./eccs/eccs.log.12
-rw-r--r-- 1 root root 10485807 12月 18 12:08 ./eccs/eccs.log.2
 

-r   如果沒有要處理的參數傳遞給xargs 默認是帶 空參數運行一次,如果你希望無參數時,停止 xargs,直接退出,使用 -r 選項即可,其可以防止xargs 后面命令帶空參數運行報錯。If the standard input does not contain any nonblanks, do not run the command, exit

 

-s size

   設置每次構造Command行的長度總大小,包括 command +init-param +傳遞參數,Size 參數必須是正整數 

 

-L num

   從標准輸入一次讀取num行送給Command命令 ,-l和-L功能一樣,不建議使用。

 

-n

  xargs 的-n選項設置每次送給command命令的參數個數,參數以空白字符或<newline>換行符分割

   -L 和 -n 標志是互相排斥的;最后指定的標志生效。

  -x 如果有任何 Command 行大於 -s Size 標志指定的字節數,停止運行 xargs 命令,-L -I -n 默認打開-x參數

常見的經典用法:

    find . -name "*.txt" |xargs rm {} 

 

 

-n num  控制每次輸入的參數個數

假設你希望使用 rm 命令(該命令將作為 xargs 命令的參數)刪除文件。然而,rm 只能接受有限數量的參數。如果你的參數列表超出該限制怎么辦?xargs 的 -n 選項限制單個命令行的參數個數。

 

寫道
[root@andes.com ~/tmp/dir]#ls
data.txt d.txt env2.txt env.txt export2.txt export.txt fuck.txt set.txt s.txt t.txt
[root@andes.com ~/tmp/dir]#ls |xargs -t -n 2 file
file data.txt d.txt
data.txt: ISO-8859 text
d.txt: ISO-8859 text
file env2.txt env.txt
env2.txt: ASCII text, with very long lines
env.txt: ASCII text, with very long lines
file export2.txt export.txt
export2.txt: ASCII text, with very long lines
export.txt: ASCII text, with very long lines
file fuck.txt set.txt
fuck.txt: ASCII text
set.txt: ASCII text, with very long lines
file s.txt t.txt
s.txt: ASCII text
t.txt: ASCII text
[root@andes.com ~/tmp/dir]#
  

 找出所有的2結尾的文件,並將其歸檔。

[root@auc-test2 eccs]# find . -name "*2" | xargs -t tar -zcvf log2.tgz
tar -zcvf log2.tgz ./eccs.log.2 ./eccs.log.12
./eccs.log.2
./eccs.log.12
  

將所有的jpg圖片文件復制到外置的硬盤中

# ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory

  

使用該方法,你能快速重命名目錄中的文件。

例3:

 

[root@eccs_web client]# ls | xargs -t -i mv {} {}.bak
mv abc.doc abc.doc.bak
mv imag2e.tgz imag2e.tgz.bak
 
 

-i 選項告訴 xargs 用每項的名稱替換 {}。-t 選項指示 xargs 先打印命令,然后再執行。

 

刪除數量比較多的文件

[root@eccs_web client]# ls | xargs -n 20 -t rm -rf

rm -rf abc.doc.bak imag2e.tgz.bak

ls當然是輸出所有的文件名(用空格分割)

xargs就是將ls的輸出,每20個為一組(以空格為分隔符),作為rm -rf的參數

也就是說將所有文件名20個為一組,由rm -rf刪除,這樣就不會超過命令行的長度了

 

刪除某個目錄下,所有.bak后綴的文件:

# find . -name '*.bak' | xargs rm -f

備注:find命令查找出符合條件的文件,xargs命令,將find找到的每一個文件,作為參數,傳給rm命令進行處理。

 

查找所有有引用SimpleDateFormat這個類的java文件:

# find . -name '*.java'  | xargs grep SimpleDateFormat
---------------------
作者:胖鵝68
來源:CSDN
原文:https://blog.csdn.net/hbiao68/article/details/52682979
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM