xargs 多行转换
最后更新于:2022-04-02 03:48:23
[TOC]
## 概述
大多数命令都不接受标准输入作为参数,只能直接在命令行输入参数,`xargs`命令的作用,是将标准输入转为命令行参数
1. xargs的默认命令是echo,空格是默认定界符
2. 将单行或多行文本输入转换为其他格式
3. xargs 相等于**循环**把前面管道的内容当作 xargs 后面的命令最后的参数
## 参数
```
-0, --null 各个项目由 null(空字符,不是空白字符)分隔;
同时停止对引用和反斜杠转义的处理及对逻辑 EOF
的处理
-a, --arg-file=文件 从指定<文件>读取参数,不使用标准输入
-d, --delimiter=分隔用字符 输入流的各个项目使用指定<分隔用字符>进行分隔,
不使用空白字符;同时停止对引用和反斜杠转义的
处理及对逻辑 EOF 的处理
-e, --eof[=终止符] 在指定<终止符>的情况下与 -E <终止符> 等效;
否则,视为文件末尾终止字符串不存在
-I R 和 --replace=R 相同
-i, --replace[=R] 将<初始参数>中的 R 替换为从标准输入读取的
名称;如果未指定 R,则假定其为{}
-L, --max-lines=最大行数 每个命令行使用最多<最大行数>行的非空输入行
-l[最大行数] 类似 -L,但在没有给出<最大行数>信息时默认为接受
最多一行非空输入行
-n, --max-args=最大参数数量 设置每个命令行可使用的<最大参数数量>
-o, --open-tty Reopen stdin as /dev/tty in the child process
before executing the command; useful to run an
interactive application.
-P, --max-procs=MAX-PROCS 同时运行至多个进程
-p, --interactive 运行命令前提示
--process-slot-var=VAR 在子进程中设置环境变量
-r, --no-run-if-empty 如果没有指定任何参数,则不运行指定的<命令>;
如果未给出该选项,指定的<命令>将至少运行一次
-s, --max-chars=最大字符数 限制命令行长度的<最大字符数>
--show-limits 显示命令行长度的限制
-t, --verbose 执行命令前输出命令内容
-x, --exit 如果大小(见 -s)超出限制则退出
--help 显示此帮助信息并退出
--version output version information and exit
```
### -d 指定分隔符
```
> echo -e "a\tb\tc" | xargs -d "\t" echo
a b c
```
### -p ,-t 询问输出
- -p参数打印出要执行的命令,询问用户是否要执行
- -t参数则是打印出最终要执行的命令,然后直接执行,不需要用户确认
```
$ echo 'one two three' | xargs -p touch
touch one two three ?...
```
### -print0 与 -0 (测试无效,使用 -n)
由于xargs默认将空格作为分隔符,所以不太适合处理文件名,因为文件名可能包含空格。
find命令有一个特别的参数 `-print0`,指定输出的文件列表以null分隔。然后,xargs命令的`-0`参数表示用null当作分隔符
如:
```
find /path -type f -print0 | xargs -0 rm
```
### -n 一次执行n行
`-n`参数指定每次将多少项,作为命令行参数
```
> echo "one two three four" | xargs -n 2 echo
one two
three four
> echo "one two three four" | xargs -n 1 echo
one
two
three
four
```
### -i 指定参数位置
```
> ls
1.txt 2.txt 3.txt log.xml
> ls *.txt |xargs -i mv {} {}.bak
mv 1.txt 1.txt.bak
mv 2.txt 2.txt.bak
mv 3.txt 3.txt.bak
```
## 示例
### 删除 指定天数天数以前的文件
```
find /xxx -type f -ctime +360 | xargs -t -n1 rm -rf
```
### 查找所有的jpg 文件,并且压缩它们
```
find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz
```
### xargs下载所有链接
`cat url-list.txt | xargs wget -c
`
';