什么是xargs命令xargs命令从标准输入或另一个命令的输出中读取文本行并将它们转换成命令并执行它们。我们经常看到xargs命令与find命令一起使用。find命令提供了一个文件名列表,而xargs命令允许我们一个一个地使用这些文件名,就好像它们是输入到另一个命令一样。由于rargs处理重定向,因此您需要先了解一些有关标准输入、输出和管道重定向的知识。关于管道重定向,请参考我们之前的文章。xargs命令的使用方法xargs命令的语法如下:xargs[options][command[initial-arguments]]但是一般我们不会这样使用。它的一个重要功能是将一个命令的输出组合成另一个命令。我们来看一个例子:假设当前路径下有一些以各种花命名的txt文件,然后有一个flowers.txt记录了所有这些txt文件的名字:[gliu@fedorawork]$lsflowers.txtlily.txtone_lotus.txtrose.txtthree_lotus.txttwo_lotus.txt[gliu@fedorawork]$catflowers.txtlily.txtone_lotus.txtrose.txthree_lotus.txttwo_lotus.txt现在我们的目标是看到flowers.txt中提到的所有文件文件的大小。根据经验,我们可以使用cat命令显示所有文件名,然后将其通过管道传递给du命令以检查文件大小。但是如果我们直接使用管道,它不会给出flowers.txt中提到的每个文件的大小:[gliu@fedorawork]$du-h52K.[gliu@fedorawork]$catflowers.txt杜-h52K。为什么?首先,du命令不接受标准输入;其次,cat命令的输出不是单个文件名,而是用换行符分隔的文本。xargs命令的神奇之处在于它将这个以空格或换行符分隔的文本转换为下一个命令的单独输入。[gliu@fedora工作]$catflowers.txt|xargsdu-h4.0Klily.txt4.0Kone_lotus.txt16Krose.txt4.0Kthree_lotus.txt16Ktwo_lotus.txt这相当于将这些文件名提供给du命令:[gliu@fedorawork]$du-hlily.txtone_lotus.txtrose。txtthree_lotus.txttwo_lotus.txt4.0Klily.txt4.0Kone_lotus.txt16Krose.txt4.0Kthree_lotus.txt16Ktwo_lotus.txtxargs命令的威力如何?xargs和find:互为存在xargs命令经常与find命令结合使用。find命令搜索文件和目录并返回它们的名称。通过xargs命令,可以将find命令的结果用于特定目的,如重命名、移动、删除等。比如我们要搜索所有包含red字样的txt文件,可以结合find和grep在xargs的帮助下执行命令:[gliu@fedorawork]$find。-typef-name"*.txt"|xargsgrep-lred./three_lotus.txt./two_lotus.txt./rose.txtfind的工作方式类似于exec命令组合。不过,我们今天只关注xargs命令。如果文件名中包含空格,则处理文件名中包含空格的文件可能会有些棘手。例如,如果我们将上面的文件three_lotus.txt重命名为三莲花.txt,那么在用xargs处理的时候,会认为是两个独立的文件,三莲花.txt:[gliu@fedorawork]$find.-输入f-name"*.txt"|xargsgrep-lred./two_lotus.txtgrep:./three:Nosuchfileordirectorygrep:lotus.txt:Nosuchfileordirectory./rose.txt在这种情况下,你可以使用-print0选项find命令,它使用ASCII空字符作为换行符而不是换行符;同时xargs命令也需要有-0选项。[gliu@fedora工作]$找到.-typef-print0-name"*.txt"|xargs-0grep-lred./two_lotus.txt./threelotus.txt./rose.txt查看正在执行的命令xargs命令的-t选项会打印出实际正在执行的命令,所以可以用来查看正在执行的命令。[gliu@fedora工作]$找到.-typef-name"*.txt"|xargs-ttouchtouch./three_lotus.txt./two_lotus.txt./lily.txt./rose.txt运行命令前,强制Xargs提示确认,有些情况需要格外小心,比如删除文件,最好查看要执行的命令,必要时可以选择拒绝执行。您可以在执行前使用-p选项进行确认:[gliu@fedorawork]$find。-typef-name"*.txt"|xargs-prmrm./three_lotus.txt./two_lotus.txt./lily.txt./rose.txt?...n结合占位符默认情况下,xargs命令将标准输入作为参数添加到命令末尾.当需要在最后一个参数之前使用它时,这会产生问题。例如,要使用移动命令,首先需要一个源,然后需要一个目标作为参数;如果你想将找到的文件移动到目标文件,它是行不通的:[gliu@fedorawork]$find.-typef-name"*.txt"|xargs-pmvnew_dirmvnew_dir./three_lotus.txt./two_lotus.txt./lily.txt./rose.txt?...ymv:target'./rose.txt'isnotadirectory这时候可以使用-l选项来使用占位符:[gliu@fedorawork]$find。-typef-name"*.txt"|xargs-p-I{}mv{}new_dirmv./three_lotus.txtnew_dir?...nmv./two_lotus.txtnew_dir?...nmv./lily.txtnew_dir?...nmv./rose.txtnew_dir?...n在上面的命令中,xargs是从findcommand所有文??件名,保存在{}中,然后转到mv命令并提供{}中的内容。这里有一个主要区别,它不是将所有文件名放在同一个命令中,而是一个一个地添加它们。这就是为每个参数单独调用mv命令的原因。注意:以上命令中使用{}作为占位符,您可以使用其他字符作为占位符。{}安全、易于理解和区分。使用xargs运行多个命令您可以使用xargs占位符运行多个命令:[gliu@fedorawork]$find。-typef-name"*.txt"|xargs-I{}sh-c'ls-l{};du-h{}'-rw-rw-r--1gliugliu0May2817:02./three_lotus.txt0./three_lotus.txt-rw-rw-r--1gliugliu0May2817:02./two_lotus.txt0./two_lotus.txt-rw-rw-r--1gliugliu0May2817:02./lily.txt0./lily.txt-rw-rw-r--1gliugliu0May2817:02./rose.txt0./rose.txt这里需要注意的是占位符不会被扩展到下一个管道重定向或者其他命令,这也是为什么上面命令中使用sh命令的原因。本文主要介绍常用的find和xargs命令的使用,但xargs命令并不局限于与find一起使用。xargs命令的一个非常实际的例子是当你想停止所有正在运行的docker容器时:dockerps-q|xargsdockerstop与其他Linux命令一样,xargs有很多选项。详细信息可以参考xargs命令的man手册。
