跳到主要内容

xargs 命令

·77 字·1 分钟

xagrs – 从标准输入获得参数并执行命令

xargs 有点类似反引号 ,但是功能更强大,它从标准输入获得参数列表,然后分割小块分段,再逐条传递给其他命令并执行。例如:

find ./ -type f | xargs grep date

该命令相当于对当前目录下的每个文件执行一次 grep date ,也就是将列出当前目录下文件内容中包含 date 的文件 。如果没有 xargs,只会列出当前目录下文件名中包含 date 字段的文件。

但是上面这个例子存在一个问题,如果文件名中包含有空格,会出错,这是因为 xargs 默认是按照空白字符来分割输入的。一个简单的解决办法就是告诉find使用NUL(\0)来分割结果(向find提供-print0选项),并且告诉xargs也使用Nul来分隔输入(-0)。例如删除当前目录下所有的 python 文件:

find ./ -name '*.py' -type f -print0 | xargs -0 rm

如果要指定参数在命令中的文件,可以用 -i 选项和 {} 的组合,参数就会被放到 {} 所在的位置。例如,将当前目录下的文件移动到 back 目录下:

find ./ -type f | xargs -i mv {} ./back/

有的命令执行时需要不止一个参数,xargs 提供了 -n 选项指定参数数目。一个简单的例子,逐对比较当前目录下的文件的不同:

find ./ -type f | xargs -n 2 diff

还用两个有用的选项:

  • -t 每次执行命令前将完整的命令打印一次
  • -r 在无输入情况下则不构造命令执行