Linux xargs命令示例

时间:2020-02-23 14:40:04  来源:igfitidea点击:

Linux/UNIX中的xargs命令从标准输入中读取由空格或者换行符分隔的项目,并使用任何初始参数将其执行一次或者多次。

如果没有提供命令作为xargs的参数,则该工具执行的默认命令是回显。

标准输入上的空白行将被忽略。
那些xargs从标准输入读取的项目可以用双引号或者单引号或者反斜杠进行保护。

xargs命令非常强大,尤其是与grep或者echo这样的命令结合使用时。
在本教程中,我们将介绍xargs命令的一些基本用法,以帮助您入门。

Linux xargs命令语法

xargs命令的语法为:

xargs [options] [command [initial-arguments]]

您可以通过从终端调用man xargs命令来查看所有选项和参数。
以下部分列出了args命令的一些示例。

Linux xargs简单示例

不带任何命令的xargs命令回显标准输入中的参数。
在下面的示例中,ls命令的输出通过管道传递到xargs命令中,而xargs命令没有任何命令将在标准输入中回显文件列表。

# ls | xargs

以下示例显示了echo命令的输出如何通过管道传递给xargs,xargs命令如何使用管道参数使用mkdir创建文件夹。

# echo 'one two three' | xargs mkdir

限制参数数

传递给xargs的参数数量由您的系统限制定义。
-n开关限制要传递给给定命令的参数数量。
xargs命令将以n个参数连续运行,直到所有参数用尽为止。

下面的示例将从标准输入中读取的参数数量限制为2。
Xargs命令将一次继续读取两个参数,直到完成读取所有参数为止。
此外,-t选项将在执行命令之前在标准输出中打印该命令。

# echo "file1 file2 file3 file4 file5" | xargs -n 2 -t touch

执行前启用用户提示

带有-p选项的xargs将在执行命令之前提示用户。
下面的示例显示xargs命令提示用户输入" Y"或者" N",然后继续使用每个参数创建文件夹。

# echo Hello World | xargs -p mkdir
# echo one two three | xargs -p -n 1 mkdir

使用find和xargs命令删除文件

xargs的最常见用法之一是将其与find命令一起使用。
考虑一种情况,您要在通过find命令运行后删除或者重命名一堆文件。
其中find和xargs命令都可以在匹配某些属性的文件上一起使用,然后一次性删除或者重命名它们。

例如,假设您要删除/tmp文件夹中所有在最近五分钟内创建的文件。
要使用xargs做到这一点,首先,使用find命令找出所有与所选条件匹配的文件,然后将输出通过管道传递给xargs命令,xargs命令随后将使用rm命令将其删除。

# find /tmp/* -cmin -5 
# find /tmp/* -cmin -5 | xargs -t rm
# find /tmp/* -cmin -5

使用xargs搜索模式

Xargs命令的另一种强大用法是在由另一个unix命令(如" ls"或者" find")返回的文件列表中搜索模式。
以下示例结合了find和xargs命令,其中find命令返回当前工作目录中的所有text(.txt)文件。
结果,即文件名,然后通过管道传递到xargs命令,在此我们使用`grep" file""搜索单词'file'。
如果文件中存在模式,则包含模式的行将与文件名一起打印在终端中:

# find . -name "*.txt" | xargs grep "file"

使用xargs运行多个命令

到目前为止,我们已经看到xargs命令如何使用管道参数来执行各种任务,例如重命名一批文件,搜索模式等。
在执行这些操作时,它将在管道操作后使用单个命令。
还可以与xargs一起运行多个命令。

例如,如果要创建多个文件并使用xargs命令同时列出它们,则可以使用带有-I开关的xargs命令,然后定义替换字符串。
然后将所有出现的替换字符串替换为传递给xargs的参数。

# echo "file1 file2 file3" | xargs -t -I % sh -c '{ touch %; ls -l %; }'

并行执行命令

在某些情况下,您可能使用xargs为每个参数调用计算密集型命令。
通过利用您的多核计算机,可以并行调用该命令。
-P开关通过定义最大进程数来精确地做到这一点。
默认情况下,最大进程数为1。

例如,以下xargs命令通过一次使用5个参数来打印数字1至30,最值得注意的是一次运行多达8个进程。

# printf %s\n {1..30} | xargs -n 5 -P 8

接受来自文件的输入

到目前为止,我们已经看到xargs命令的输入是通过管道操作从标准输入或者其他命令的输出中读取的。
但是,xargs命令也可以直接从文件读取输入。
-a开关允许您为xargs所需的输入定义文件。

以下xargs命令从文件(input.txt)读取输入,然后使用touch命令创建文件。

# cat input.txt
one.txt
two.txt
# xargs -a input.txt touch