Linux 中的 10 个 Xargs 命令示例

举报
Tiamo_T 发表于 2022/08/18 17:13:18 2022/08/18
【摘要】 当我们将 xargs 命令与其他命令结合使用时,它非常有用。 本教程通过几个简单的示例解释了 xargs 命令的用法。

当我们将 xargs 命令与其他命令结合使用时,它非常有用。

本教程通过几个简单的示例解释了 xargs 命令的用法。

这些示例将帮助您了解 xargs 命令如何工作的基础知识。但是,一旦你理解了这些概念,你就可以想出自己的聪明的 xargs 例子来解决各种命令行问题。

xargs 的语法(来自手册页):

xargs [-0prtx] [-E eof-str] [-e[eof-str]] [–eof[=eof-str]] [–null] [-d delimiter] [–delimiter delimiter] [-I replace- str] [-i[replace-str]] [–replace[=replace-str]] [-l[max-lines]] [-L max-lines] [–max-lines[=max-lines]] [ -n max-args] [–max-args=max-args] [-s max-chars] [–max-chars=max-chars] [-P max-procs] [–max-procs=max-procs] [–interactive] [–verbose] [–exit] [–no-run-if-empty] [–arg-file=file] [–show-limits] [–version] [–help] [command [initial-arguments ]]

1. Xargs 基本示例

xargs 命令(默认情况下)需要来自标准输入的输入,并在输入上执行 /bin/echo 命令。以下是在没有任何参数的情况下执行 xargs 或在不与任何其他命令组合的情况下执行它时会发生的情况。

当您键入不带任何参数的 xargs 时,它会提示您通过 stdin 输入输入:

$ xargs
Hi,
Welcome to TGS.

键入内容后,按 ctrl+d,这将在标准输出上将字符串回显给您,如下所示。

$ xargs
Hi,
Welcome to TGS.Hi, Welcome to TGS.

2. 使用 -d 选项指定分隔符

可以应用分隔符,以便使用 xargs 中的 -d 选项按字面意思获取输入中的每个字符。

在前面的示例中,即使输入在 'Hi' 之后包含一个 \n(换行符),但回显的输出不包含换行符 '\n' 。因此,前面示例中的输出被合并为一行。

在以下示例中,当您使用 -d\n 时,它将在输出中保留换行符分隔符,并完全按照输入的方式显示输出。

$ xargs -d\n
Hi,
Welcome to TGS.

键入上述内容后,按 ctrl+d,这将在 stdout 上将字符串回显给您,如下所示。但是,这一次它将保留换行符。

$ xargs -d\n
Hi,
Welcome to TGS.Hi, 
Welcome to TGS.

3. 使用 -n 选项限制每行输出

默认情况下,如前所述,xargs 显示其标准输入的任何内容,如下所示。

$ echo a b c d e f| xargs
a b c d e f

但是,可以使用 -n 选项将 xargs 命令的输出拆分为多行。

在以下示例中,我们使用了 -n 3,它将在 xargs 输出中每行仅显示 3 个项目。

$ echo a b c d e f| xargs -n 3
a b c
d e f

同样,您还可以使用 -n 2 将输出拆分为每行 2 个项目,如下所示。

$ echo a b c d e f| xargs -n 2
a b
c d
e f

4. 使用 -p 选项在执行前提示用户

使用选项 -p,您可以确认用户执行 xargs 命令。

考虑前面的示例,如果我们想确认用户每次执行 /bin/echo 命令,请使用 -p 选项和 -n 选项,如下所示。

$ echo a b c d e f| xargs -p -n 3
/bin/echo a b c ?...y
/bin/echo d e f ?...a b c
y
d e f

在下面的输出中,我对所有 echo 输出说“n”。因此, xargs 没有执行任何操作。

$echo abcdef| xargs -p -n
/bin/echo abc ?...n
/bin/echo def ?...n
/bin/echo ?...n

注意:当您将 xargs 与诸如 rm 之类的破坏性命令结合使用时,这很有帮助。在这些情况下,您可能想看看 xargs 做了什么。

5. 使用 -r 选项避免空白输入的默认 /bin/echo

当有空白输入时(即 xargs 命令没有输入),它将执行 /bin/echo 命令,该命令将显示一个新行,如下所示。

$ xargs -p

输入“xargs -p”后按 ctrl-d,这将表明它执行了 /bin/echo,如下所示。

$ xargs -p
                      /bin/echo ?...y

$

6. 使用 -t 选项打印命令和输出

在以下示例中,键入“abcd”作为 xargs -t 命令的输入。

$ xargs -t
A B C D

按 ctrl-d 完成上面的 xargs -t 命令,在显示输出之前会显示 xargs 真正执行的命令。在这种情况下,xargs 执行的命令是“/bin/echo abcd”,此处显示。

$ xargs -t
A B C D
/bin/echo abcd
A B C D

7. 结合 Xargs 和 Find 命令

它是 xargs 命令最重要的用法之一。当您需要查找某种类型的文件并对它们执行某些操作时(最流行的是删除操作)。

当我们与其他命令结合使用时,xargs 命令非常有效。

在以下示例中,我们获取find 命令的输出,并将其作为输入传递给 xargs 命令。但是,我们不是执行默认的 /bin/echo 命令,而是指示 xargs 命令对输入执行 rm -rm 命令。

因此,在本例中,find 命令的输出是所有带有 *.c 扩展名的文件,作为 xargs 命令的输入,该命令反过来对所有 *.c 文件执行“rm -rf”命令.

$ ls
one.c  one.h  two.c  two.h

$ find . -name "*.c" | xargs rm -rf

$ ls
one.h  two.h

8.删除文件名中有空格的文件

所以我们看到,尽管对该目录中的 .c 文件运行了 rm 命令,但文件“The Geek Stuff.c”并没有被删除。这是因为此文件的名称中包含空格字符。

如以下示例所示,它删除了除一个之外的所有扩展名为 *.c 的文件。即文件名中有空格的文件(即“The Geek Stuff.c”)没有被rm 命令删除。

$ touch "The Geek Stuff.c"

$ ls
one.c  one.h  two.c  two.h The Geek Stuff.c

$ find . -name "*.c" | xargs rm -rf

$ ls
one.h  two.h  The Geek Stuff.c

在这种情况下,使用 find 命令的 -print0 选项和 xargs 命令的 -0 选项来删除文件,包括文件名中有空格的文件,如下所示。

$ ls
one.c  one.h  two.c  two.h The Geek Stuff.c

$ find . -name "*.c" -print0 | xargs -0 rm -rf

$ ls
one.h  two.h

9. 使用 –show-limits 选项在 xargs 上显示系统限制

请参见下面的示例:
以下示例显示了操作系统设置的所有限制,这些限制将对 xargs 命令的工作方式产生影响。

$ xargs --show-limits
Your environment variables take up 1203 bytes
POSIX upper limit on argument length (this system): 2093901
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 2092698
Size of command buffer we are actually using: 131072

Execution of xargs will continue now, and it will try to read its input and 
run commands; if this is not what you wanted to happen, please type the 
end-of-file keystroke.

Warning: /bin/echo will be run at least once.  If you do not want that to happen, 
then press the interrupt keystroke

10. 结合 Xargs 和 Grep 命令

xargs 命令可以与grep 命令结合使用,以从 find 命令的搜索结果中过滤特定文件。

在以下示例中,find 命令提供了所有 .c 文件作为 xargs 的输入。

xargs 命令执行 grep 命令以查找包含字符串“stdlib.h”的所有文件(在 find 命令提供的文件中)。

$ find . -name '*.c' | xargs grep 'stdlib.h'
./tgsthreads.c:#include
./valgrind.c:#include
./direntry.c:#include
./xvirus.c:#include
./temp.c:#include
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。