> For the complete documentation index, see [llms.txt](https://linux-in-action.gitbook.io/project/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://linux-in-action.gitbook.io/project/ji-ben-cao-zuo/xargs.md).

# xargs 命令

`xargs` 指令可以从标准输入读取数据，并利用这些数据“组建”为参数并“执行”指令。它的作用是将参数列表转换成小块分段传递给其他命令，以避免参数列表过长的问题。

`xargs` 的默认命令 COMMAND 是 `echo` ，**空格** 是默认定界符。 这意味着通过管道传递给 `xargs` 的输入将会包含换行和空白，不过通过 `xargs` 的处理，换行和空白将被空格取代。

`xargs` 是构建单行命令的重要组件之一。

## 命令用法

```bash
$ xargs [OPTION]... COMMAND [INITIAL-ARGS]...
```

使用 `INITIAL-ARGS` 参数以及从 input 那里读到的参数一起传递给 `COMMAND` 命令运行。

## 常用可选参数

| 参数                          | 说明                                                                                      |
| --------------------------- | --------------------------------------------------------------------------------------- |
| `-0, --null`                | 各个参数项由 null 分割而不是空格分隔；禁止任何引号以及反斜杠处理，还有逻辑上的 EOF 处理                                       |
| `-a, --arg-file=FILE`       | 从 `FILE` 文件中读取参数而不是从标准输入中读取；如果你使用此选项，除非 标准输入 已经被重定向到 `/dev/null`，否则，执行命令时不会影响 标准输入 中的数据 |
| `-d, --delimiter=CHARACTER` | 输入流中的参数项由 `CHARACTER` 分割而不是空格分割；禁止任何引号以及反斜杠处理，还有逻辑上的 EOF 处理                             |
| `-E END`                    | 设置逻辑上的 EOF 字符串；如果在一行的输入中出现 END，那么剩下的输入内容都被忽略（如果指定了 `-0` 或 `-d` 则此项忽略                    |
| `-i, --replace[=R]`         | 将从标准输入中读取到的 INITIAL-ARGS 中的值替换掉指定的 `R`，如果 R 没有指定，就假定使用 `{}`                             |
| `-L, --max-lines=MAX-LINES` | 每条指令行最多使用 `MAX-LINES` 行非空输入行；末尾的空白会使一个输入行在逻辑上延伸到下一行                                     |
| `-n, --max-args=MAX-ARGS`   | 每条指令行最多使用 `MAX-ARGS` 个参数                                                                |
| `-P, --max-procs=MAX-PROCS` | 同时运行 `MAX-PROCS` 个进程，默认值是 1，如果指定为 0，则 xargs 将尽可能的运行多个进程；一般配合 `-n` 或 `-L` 使用。否则最会执行一个进程  |
| `-r, --no-run-if-empty`     | 如果标准输入中没有任何非空的字符，则不运行命令；默认情况下即使标准输入没有非空字符，命令也会被运行一次                                     |

## 使用实例

1. 递归删除目录下的 `.jpg` 文件：

   ```bash
    $ find . -name "*.jpg" | xargs rm
   ```

## ※ xargs 和管道 | 的区别

* 管道 `|` ：前面的标准输出作为后面的标准输入；
* xargs ：将标准输入作为命令的参数；
