8 个Linux的Xargs命令的初学者的实际例子

Linux xargs命令可能不是一个非常受欢迎的命令行工具,但这并不能消除这一点非常有用的事实,尤其是与其他命令(如findgrep)相结合时。 如果你是xargs的新手,而且想了解它的用法,你会很高兴知道这正是我们在这里做的。

Before we proceed, please keep in mind that all the examples presented in this tutorial have been tested on Ubuntu 14.04 LTS. Shell used is Bash, and version is 4.3.11.

Xargs命令如何工作?

那么,在跳过它的用法之前,了解Xargs究竟做了什么很重要。 按照外行人士的说法,这个工具 - 最基本的形式 - 从标准输入(stdin)读取数据,并根据输入读取执行命令(作为参数提供给它)一次或多次。 输入中的任何空白和空格都被视为分隔符,而空行被忽略。

如果没有命令作为xargs的参数提供,则该工具执行的默认命令是echo 。 例如,在下面的例子中,我刚刚执行'xargs',并在stdin中输入'Hello World'。 当我按Ctrl + D(告诉xargs我们完成了输入), echo命令被自动执行,并且再次打印“Hello World”。

2.如何使用xargs与另一个命令?

echo是xargs执行的默认命令,您可以明确指定任何其他命令。 例如,您可以将find命令及其'-name'选项作为参数传递给xargs,然后通过stdin传递要搜索的文件(或文件类型)作为输入的名称。

以下是完整的命令:

xargs find -name

例如,我们通过stdin在输入中提供了“* .txt”,这意味着我们希望find命令可以搜索当前目录(以及其子目录)中的所有.txt文件。

这是命令行动:

3.如何使xargs多次执行命令(每个输入行/参数一次)

在上一节中我们讨论的例子中,我们想搜索.txt文件,所以我们在输入中提供了“* .txt”。 但是,如果要求也要搜索其他类型的文件,如.log和.tmp呢?

尝试在“* .txt”之后将其作为xargs的输入,看看会发生什么。 那么你应该得到类似于以下的错误:

这是因为xargs将“* .txt”和“* .log”作为文件名输入到find命令,然后在输入中使用两个文件名运行时找到失败。 您可以通过以下方式思考find命令:

find -name "*.txt" "*.log"

这不是正确的方法。

我们想要的是,xargs命令应该首先将“* .txt”传递给find命令,以便find给出与.txt文件相关的结果,然后传递“* .log”。 这可以使用xargs提供的-L命令行选项来完成。

-L命令行选项需要一个数字,它被视为在一次中作为命令输入的最大非空行数。 所以,在我们的例子中,该值将为1,因为我们希望一个输入行作为输入一次传递。

所以,这是我们应该运行的命令:

xargs -L 1 find -name

以下屏幕截图显示了上述命令行动:

到现在为止还挺好。 但是,如果以下列方式传递输入,该怎么办?

"*.txt" "*.log"

那么命令会失败,因为'-L 1'将确保完整的行被传递给find命令。

在这种情况下,您可以使用'-n'命令行选项。

'-n'命令行选项(如'-L')需要一个数字,表示您希望xargs通过每个命令行的参数数。 在我们刚刚讨论的情况下,“* .txt”和“* .log”应该是不同的参数,因为我们希望它们被单独传递,所以我们必须将'1'作为值提供给'-n'。

 xargs -n 1 find -name

所以这些是我们使xargs多次执行命令的方式。

4.如何使xargs处理带有空格的文件名

如果你回想起来,一开始我们提到xargs将空格(以及换行符)作为分隔符。 如果文件名作为xargs的输入传递,则会导致问题,其中包含空格。

例如,假设当前目录包含一个名为'new music.mp3'的文件,并且您希望xargs将此名称传递给mplayer ,以便后者可以播放该文件。 如果你按常规方式去,你会得到一个错误:

这是因为由于'new'和'music.mp3'之间的空间,这些被mplayer视为两个不同的文件。 解决此问题的一种方法是在提供输入时使用反斜杠:

new\ music.mp3

另一种方法是更改​​分隔符,您可以使用-d选项来执行。 例如,您可以要求xargs仅将换行符作为分隔符,可以通过以下方式完成:

xargs -d '\n' mplayer

如何使xargs处理带有换行符的文件名

所以,现在我们知道如何使xargs处理包含空格的文件名。 但是换行呢? 是的,文件名也可以换行。 例如,有一个名为'foo'[newline]'file.txt'的文件。 在终端上,名称显示为“foo?file.txt”。

现在,假设我想要find命令查找所有以文本“foo”开始的文件,然后使用xargs在gedit中打开这些文件。 这是命令:

find . -name "foo*" | xargs gedit

可悲的是,该命令无法实现其目的,因为在Gedit中打开名称为“foo”的新文件。 这可能是因为换行符被xargs视为分隔符。

要排除此问题,请使用-print0选项查找优惠并将其与xarg的-0选项相结合。 以下是搜索的手册页面解释此选项的方式:

 -print0
True; print the full file name on the standard output, followed by a null character (instead of thenewline character that -print uses). This allows file names that contain newlines or other types ofwhite space to be correctly interpreted by programs that process the find output. This option corresponds to the -0 option of xargs.

所以,这是我们应该使用的命令:

find . -name "foo*" -print0 | xargs -0 gedit

6.如何查找包含特定文本的文件

如果要搜索包含特定文本/字符串的文件,则xargs命令非常方便。 例如,如果要查找包含文本“abc”的.txt文件,则可以通过以下方式完成此操作:

find -name "*.txt" | xargs grep "abc"

这是命令行动:

很明显,在这种情况下,xargs命令从find命令获取其输入。

7.如何使xargs接受文件的输入

到目前为止,我们已经看到xargs接受stdin(这是默认行为)的输入以及另一个命令(在上一节中讨论过)。 但是,如果需要,也可以让xargs接受文件的输入。

命令的-a选项允许您执行此操作。 此选项期望一个文件名 - 这将是xargs将从其读取输入的文件。

例如,假设有一个名称为“input.txt”的文件。 它包含xargs的输入(基本上,内容是两个文件名:testfile1.txt和testfile2.txt)。 以下是xargs可以用来读取此文件的输入,并将其传递给另一个命令,比如说ls

xargs -a input.txt ls -lart

这是命令行动:

8.如何使xargs在执行命令之前寻求用户权限

我们已经讨论过如何使xargs多次执行命令(见上面的第3点)。 但是,如果您希望xargs在每次运行命令时请求您的许可? 那可能吗? 是的,它是 - -p命令行选项使它成为可能。

以下是以交互方式运行xargs的示例:

结论

我们刚刚在这里划伤了表面,因为xargs命令提供了许多其他功能,以命令行选项的形式。 请尝试我们在本教程中解释的xargs概念/功能,如有疑问或查询,请浏览其手册页

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏