xargs 是 Linux 中最强大的命令之一。在本教程中,您将通过一些实用且有用的示例来学习使用 xargs 命令。
xargs 是 Linux 中最强大的命令之一。在本教程中,我将向您展示如何使用 xargs 将标准输入转换为命令。
xargs 命令从标准输入或另一个命令的输出中读取文本行,并将它们转换为命令并执行它们。
您经常会发现 xargs 命令与 find 命令一起使用。 find 命令为您提供文件名列表,而 xargs 命令可让您逐个使用这些文件名,就像将其输入到另一个命令一样。
由于 xargs 适用于重定向,因此我强烈建议您温习 Linux 中的 stdin、stdout 和管道重定向的知识。

xargs 命令具有以下语法:
但您可能不会那样使用它。它的强大之处在于将一个命令的输出组合到另一个命令中。让我们看一个简单的例子。
在我当前的目录中,我有一些文本文件,flowers.txt 包含所有这些文件的名称:
现在我的目标是查看flowers.txt 中提到的所有文件的文件大小。常识告诉我,我可以结合 cat 命令来显示所有文件名,然后将其通过管道传递给 du 命令来检查文件大小。
但如果我直接通过管道传输它,它不会给出flowers.txt 文件中提到的每个文件的大小。
为什么?首先,du 命令不接受标准输入。其次,cat 命令的输出不是单个文件名。它就像一个由换行符分隔的单词。
xargs 命令的神奇之处在于,它将将此内容和由空格或换行符分隔的文本转换为下一个命令的单独输入。
将其视为相当于将这些文件名提供给 du 命令:
您现在意识到 xargs 命令的强大功能了,不是吗?
您经常会发现它与“查找命令”结合使用。
find 命令搜索文件和目录并返回它们的名称。借助 xargs,您可以将 find 命令的结果用于特定目的,例如重命名它们、移动它们、删除它们等等。
假设您想要获取所有以 .txt 结尾且包含单词 red 的文件。您可以在 xargs 的帮助下组合 find 和 grep 命令:
find exec 命令组合的工作原理类似。但我们在这里重点关注 xargs 命令。
如果您的文件名称中包含空格,则会导致问题。假设我将 Three_lotus.txt 重命名为“三 Lotus.txt”。现在,当通过 xargs 处理它时,它被视为两个单独的文件,如 3 和 Lotus.txt。
在这种情况下,您应该使用 find 命令的 -print0 选项。它使用 ASCII 空字符而不是换行符分隔行。同样,您还应该使用带有 -0 的 xargs 来接受 ASCII 空值。
如果你想借助 xargs 查看正在执行什么命令,可以使用 -t 选项。它将打印正在执行的实际命令。
有些情况需要格外小心,例如删除文件。最好查看将要执行什么命令并可以选择拒绝执行。
您可以使用 xargs 的 -p 选项来获取提示。
默认情况下,xargs 命令将标准输入作为参数添加到命令末尾。当您需要在最后一个参数之前使用它时,这会产生问题。
例如,如果使用 move 命令,则首先需要源,然后是目标。如果你想将找到的文件移动到目标目录,这个命令将不起作用:
您可以在 xargs 中使用带有选项 -I like this 的占位符:
可以将其想象为 xargs 从 find 命令获取所有文件名并将其保存在 {} 中。然后它转到 mv 命令并提供 {} 的内容。
这里的主要区别在于,它不是将所有文件名放在同一个命令中,而是将它们一一添加。这就是为每个参数调用 mv 命令的原因(如上例所示)。
注意:我使用 {} 作为占位符。您可以将大多数其他字母或字符作为占位符。 {} 是安全的选择,并且易于理解和区分。
您可以使用占位符通过 xargs 运行多个命令。
请记住,占位符不会扩展到下一个管道重定向或其他命令。这就是我在这里使用 sh 命令的原因。
我在此处的示例中主要使用 find 和 xargs 命令,因为这是您最常看到的。但这并不意味着 xargs 仅限于与 find 命令一起使用。 xargs 命令的一个这样的实际示例是当您想要停止所有正在运行的 docker 容器时:
与大多数其他 Linux 命令一样,xargs 也有更多选项。您可以随时参考 xargs 命令的手册页以获取更多信息。
我认为这里列出的 xargs 命令示例足以让您很好地理解这个很棒的命令。
如果您有任何疑问或建议,请在评论部分告诉我。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/10264.html