适合初学者的 Linux Xargs 命令的 8 个实用示例适合初学者的 Linux Xargs 命令的 8 个实用示例适合初学者的 Linux Xargs 命令的 8 个实用示例适合初学者的 Linux Xargs 命令的 8 个实用示例
  • 业务
  • 目标
  • 支持
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容

适合初学者的 Linux Xargs 命令的 8 个实用示例

发表 admin at 2025年2月28日
类别
  • 未分类
标签
月額480円〜の高速レンタルサーバー ColorfulBox

Linux 命令 xargs 可能不是一个非常流行的命令行工具,但这并没有改变它非常有用的事实,特别是与 find 和 grep 等其他命令结合使用时。如果您还不知道 xargs 并且想了解它的用法,您会很高兴知道我们将在这里这样做。

Before we proceed, please keep in mind that all the examples presented in this tutorial have been tested on Ubuntu 22.04 LTS. The shell used on my system is Bash.

1. Xargs命令如何工作?

好吧,在开始使用它之前,了解 Xargs 到底做什么很重要。通俗地说,该工具以其最基本的形式从标准输入 (stdin) 读取数据,并根据读取的输入执行命令(作为参数提供给它)一次或多次。输入中的任何空白和空格都被视为分隔符,而空白行将被忽略。

如果没有将命令作为参数提供给 xargs,则该工具执行的默认命令是 echo。例如,在下面的示例中,我刚刚执行了“xargs”并在标准输入上输入了“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 命令按以下方式运行:

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

这不是正确的方法。

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

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

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

xargs -L 1 find -name

以下屏幕截图显示了上述命令的运行情况:

到目前为止,一切都很好。但是如果您通过以下方式传递输入会怎样:

"*.txt" "*.log"

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

在此类情况下,您可以使用“-n”命令行选项。

“-n”命令行选项与“-L”一样,需要一个数字来表示您希望 xargs 在每个命令行传递的参数数量。在这种情况下,我们刚刚讨论过,“*.txt”和“*.log”应该是不同的参数,并且由于我们希望它们单独传递,因此我们必须提供“1”作为“-n”的值。

xargs -n 1 查找-名称

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

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

如果您还记得,一开始我们提到 xargs 将空格(以及换行符)视为分隔符。如果作为输入传递给 xargs 的文件名包含空格,这可能会导致问题。

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

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

new\ music.mp3

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

xargs -d '\n' mplayer

5.如何让xargs处理带有换行符的文件名

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

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

find . -name "foo*" | xargs gedit

遗憾的是,该命令未能实现其目的,因为在 Gedit 中打开了一个名为“foo”的新文件。这可能是因为换行符被 xargs 视为分隔符。

要解决此问题,请使用查找优惠的 -print0 选项并将其与 xarg 的 -0 选项结合起来。 find 的手册页对此选项的解释如下:

 -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 概念/功能,如果有任何疑问或疑问,请浏览其手册页。

©2015-2025 Norria support@alaica.com