文章目錄
1 xargs簡介
xargs可以將標準輸入作爲輸入內容轉換成後續命令行的參數;
通常用於標準輸入或者處理管道將其轉換成特定命令行的執行參數
!
其常用功能總結如下:
- 爲不支持管道的命令行轉換並輸入參數,例如cp,mv,touch,ls;
- 各種形式分割參數,避免參數過長;
2 基本應用
-
創建測試文件;
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
-
篩選文件
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選項配合可以有效避免名字識別錯誤問題!