xargs
是 build 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>
会列出命令的基本和常用的用法,tldr
是 too 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
命令成功执行。
(完)