日期:2022年12月3日标签:DeveloperHandbook

linux 中的 xargs 命令 #

xargsbuild and execute 的意思,名字有些奇怪(linux 中很多命令都是缩写,在我看来都很奇怪)。用另一种解释可能更容易记忆:execute with arguments,带参数执行。

使用 tldr 工具查看下 xargs 的基本用法:

$ tldr xargs
xargs
Execute a command with piped arguments coming from another command, a file, etc.The input is treated as a single block of text and split into separate pieces on spaces, tabs, newlines and end-of-file.More information: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/xargs.html.

 - Run a command using the input data as arguments:
   {{arguments_source}} | xargs {{command}}

 - Run multiple chained commands on the input data:
   {{arguments_source}} | xargs sh -c "{{command1}} && {{command2}} | {{command3}}"

 - Delete all files with a .backup extension (-print0 uses a null character to split file names, and -0 uses it as delimiter):
   find . -name {{'*.backup'}} -print0 | xargs -0 rm -v

 - Execute the command once for each input line, replacing any occurrences of the placeholder (here marked as _) with the input line:
   {{arguments_source}} | xargs -I _ {{command}} _ {{optional_extra_arguments}}

 - Parallel runs of up to max-procs processes at a time; the default is 1. If max-procs is 0, xargs will run as many processes as possible at a time:
   {{arguments_source}} | xargs -P {{max-procs}} {{command}}

xargs 的作用是将一个命令的输出重定向为另一个命令的参数,然后执行这个命令

tldr 是查看 linux 中命令的基本用法的工具,毕竟 man <command> 显示的内容太多了,不方便阅读。而 tldr <command> 会列出命令的基本和常用的用法,tldrtoo long don't read 的缩写,意味太长了懒得读。如果没有安装可以执行:sudo apt install tldr

为了解释 xargs 命令的作用,看一个例子:将目录下的空文件都删除。

创建一些文件:

$ mkdir tmp
$ touch tmp/file{1..100}.txt

使用 find <dir> -empty 查看 tmp/ 目录下的空文件(刚刚创建的所有文件都是空文件):

$ cd tmp/
$ find . -empty
./file57.txt
./file51.txt
./file78.txt
./file7.txt
./file92.txt
./file19.txt
./file39.txt
./file76.txt
...

可以通过 pipeline 删除这些空文件,你可能会直接使用 rm 命令:

$ find . -empty | rm
rm: missing operand
Try 'rm --help' for more information.

想了解更多关于 pipeline 的知识:Pipelines in Shell

但是并没有成功,因为 rm 命令并不会读取标准输入,所以 rm 命令失败了,rm 命令执行需要参数即要删除的文件,那么如何将 find 命令查找的结果作为参数传递给 rm 命令并执行这个命令呢?

这正是 xargs 命令的作用:

$ find . -empty | xargs rm

借用 xargs 使 rm 命令成功执行。

(完)

目录