xargs命令備忘

1 xargs簡介

xargs可以將標準輸入作爲輸入內容轉換成後續命令行的參數;

通常用於標準輸入或者處理管道將其轉換成特定命令行的執行參數

其常用功能總結如下:

  • 爲不支持管道的命令行轉換並輸入參數,例如cp,mv,touch,ls;
  • 各種形式分割參數,避免參數過長;

2 基本應用

  1. 創建測試文件;

    user@user:~/test$ touch a.md b.md c.md 1.js 2.js
    user@user:~/test$ ls
    1.js  2.js  a.md  bin  b.md  c.md
    
  2. 篩選文件

    fwd@fwd:~/test$ ls *.md | xargs ls -al
    -rw-r--r-- 1 fwd fwd 0 8月   3 22:44 a.md
    -rw-r--r-- 1 fwd fwd 0 8月   3 22:44 b.md
    -rw-r--r-- 1 fwd fwd 0 8月   3 22:44 c.md
    

3 進階:參數替換

-I選項支持我們將管道傳入參數替換成指定字符串,並再後續執行中使用字符串展開爲實際值進行處理。仍然以2創立文件爲例進行說明;

使用命令:

 ls *.md | xargs -I '{}' mv {} {}.backup
  ls *.md | xargs -I '%' mv % %.backup

執行結果:

fwd@fwd:~/test$ ls *.md | xargs -I '{}' mv {} {}.backup
fwd@fwd:~/test$ ls -l
總用量 4
-rw-r--r-- 1 fwd fwd    0 8月   3 22:44 1.js
-rw-r--r-- 1 fwd fwd    0 8月   3 22:44 2.js
-rw-r--r-- 1 fwd fwd    0 8月   3 22:44 a.md.backup
drwxr-xr-x 2 fwd fwd 4096 8月   3 22:03 bin
-rw-r--r-- 1 fwd fwd    0 8月   3 22:44 b.md.backup
-rw-r--r-- 1 fwd fwd    0 8月   3 22:44 c.md.backup

4 進階:使用-0分割

默認情況下我們從管道或者標準輸入分割參數,使用空格或者回車分割,xargs提供了多種其他分割機制。

  • -0 代表使用NULL字符進行分割;
  • –delimiter=delim, -d delim 使用一個指定字符進行參數分割;
  • -E eof-str 用eof結束符分割參數

有時候文件存在特殊字符,比如空格或者回車字符,使用

touch 'hello 01.js' 'hello 02   .js'

fwd@fwd:~/test$ touch 'hello 01.js' 'hello 02   .js'
fwd@fwd:~/test$ ls -l
總用量 4
drwxr-xr-x 2 fwd fwd 4096 8月   3 22:03  bin
-rw-r--r-- 1 fwd fwd    0 8月   3 23:11 'hello 01.js'
-rw-r--r-- 1 fwd fwd    0 8月   3 23:11 'hello 02   .js'

此時使用之前形式會形成錯誤分割,造成無法正確識別文件:

fwd@fwd:~/test$ find . -name "*.js"|xargs ls -l
ls: 無法訪問'./hello': 沒有那個文件或目錄
ls: 無法訪問'01.js': 沒有那個文件或目錄
ls: 無法訪問'./hello': 沒有那個文件或目錄
ls: 無法訪問'02': 沒有那個文件或目錄
ls: 無法訪問'.js': 沒有那個文件或目錄
-rw-r--r-- 1 fwd fwd 0 8月   3 22:03 ./bin/a.js
-rw-r--r-- 1 fwd fwd 0 8月   3 22:03 ./bin/b.js

此時應該修正命令行如下所示

fwd@fwd:~/test$ find . -name "*.js" prin0 |xargs -0 ls -l
find: paths must precede expression: `prin0'
總用量 4
drwxr-xr-x 2 fwd fwd 4096 8月   3 22:03  bin
-rw-r--r-- 1 fwd fwd    0 8月   3 23:11 'hello 01.js'
-rw-r--r-- 1 fwd fwd    0 8月   3 23:11 'hello 02   .js'

如上所示,執行結果沒有了之前所示報錯。主要原因是我們再find參數使用時候使用了print0選項,將查找結果加入NULL字符後進行輸出顯示;然後xargs配合使用-0選項識別參數結束符,將有效文件名進行分割識別,避免錯誤將文件名空格截取導致無法識別文件名的問題!

find . -name "*.js"|xargs ls -l

5 實用妙招

5.1 下載文件內的所有url內容

5.2 將入參分割成指定組數

5.3 使用指定分割功能將一個字符串分割多個參數

#### 1-下載文件的制定下載鏈接
cat url-list.txt | xargs wget -c
#### 2-將打印一列數字的偶數個篩選出來排序
echo " 1 21 1 12 212 18" | xargs -n2 | awk '{print $2}'|sort -r
####3-
echo "user#ding#127.0.0.1#8080" | xargs -d "#"

6 備忘

使用-t參數記錄xargs執行結果

fwd@fwd:~/test$ ls *.md | xargs -t -I '%' mv % %.1
mv a.md.backup.md a.md.backup.md.1 
mv b.md.backup.md b.md.backup.md.1 
mv c.md.backup.md c.md.backup.md.1 

find 與xargs何用時候,爲了避免文件名中含有特殊字符,特別是空格,會使用print0作爲輸出,相應的xargs使用-0選項配合可以有效避免名字識別錯誤問題!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章