文章目录
- 1 xargs简介
- 2 基本应用
- 3 进阶:参数替换
- 4 进阶:使用-0分割
- 5 实用妙招
- 5.1 下载文件内的所有url内容
- 5.2 将入参分割成指定组数
- 5.3 使用指定分割功能将一个字符串分割多个参数
- 6 备忘
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选项配合可以有效避免名字识别错误问题!