文章目录

  • 1 xargs简介
  • 2 基本应用
  • 3 进阶:参数替换
  • 4 进阶:使用-0分割
  • 5 实用妙招
  • 5.1 下载文件内的所有url内容
  • 5.2 将入参分割成指定组数
  • 5.3 使用指定分割功能将一个字符串分割多个参数
  • 6 备忘


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
  1. 筛选文件
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选项配合可以有效避免名字识别错误问题!