如何在Linux上使用xargs命令(非常详细)零基础入门到精通,收藏这一篇就够了

在使用 Linux 时,你是否遇到过需要将一些命令串在一起,但是其中一个命令不接受管道输入的情况呢?在这种情况下,我们就可以使用 xargs 命令。xargs 可以将一个命令的输出作为参数发送给另一个命令。

在 Linux 中,所有标准的应用程序都有与之关联的三个数据流。分别是标准输入流(stdin),标准输出流(stdout)和标准错误流(stderr)。这些流通过文本来运行,我们使用文本将输入(stdin)发送到命令,然后响应(stdout)将会以文本形式显示在终端窗口上。错误消息也以文本的形式显示在终端窗口上(stderr)。

Linux 和类 Unix 操作系统的一大功能是可以将一个命令的标准输出流传递到另一个命令的标准输入流。第一个命令不会管它的输出是否写到了终端窗口,第二个命令也不会管它的输入是否来自键盘。

虽然所有 Linux 命令都有三个标准流,但是并不是所有命令都接受另一个命令的标准输出作为它的标准输入流的输入。因此我们无法通过管道将输入传给这些命令。

xargs是一个使用标准数据流构建执行管道的命令。通过使用xargs命令我们可以使 echormmkdir 等命令接受标准输入作为它们的参数。

xargs命令

xargs接受管道输入,也可以接受来自文件的输入。xargs 使用该输入作为我们指定的命令的参数。如果我们没有给xargs指定特定的命令,则默认使用 echoxargs 始终生成单行输出,即使输入的数据是多行的。

假如我们使用 ls-1(每行列出一个文件)选项,则会得到一列文件名称:

$ ls -1 ./*.sh

这一命令列出了当前目录中的 Shell 脚本文件。

如果我们将输出结果通过管道传递给 xargs ,会得到什么样的效果?

$ ls -1 ./*.sh | xargs

可以看出来,输出以一长串文本的形式写到了终端上。由此可见,xargs 可以将输出作为参数传递给其他命令。

配合wc命令使用xargs

我们可以使用 xargs 命令轻松地让 wc 命令计算多个文件中的单词数,字符数和行数

$ ls *.c | xargs wc

执行结果如下:

命令运行结果显示了每个文件的统计信息以及总数。

这条命令执行了以下操作:

  • ls列出了所有的 .page 文件,并将该列表传给了xargs
  • xargs 将所有文件名传递给 wc
  • wc 将这些文件名作为命令行参数进行处理。
使用带有确认消息的xargs

我们可以使用 -p(交互)选项来让 xargs 提示我们是否要进行下一步的操作。

如果我们通过 xargs 将一串文件名的字符串传递给 touch 命令,touch 将创建这些文件。

$ echo 'one two three' | xargs -p touch

终端上显示将要执行的命令,xargs 等待我们输入 yYnN 并按 Enter 来响应。如果只按了 Enter ,则视为 n。只有当我们当输入 yY 时才执行该命令。

我们按下y和 Enter ,然后使用ls用来检查文件是否已经创建。

$ ls one two three

将xargs与多个命令一起使用

我们可以用-I(初始参数)选项来将 xargs 和多个命令一起使用。这一选项定义了替换字符串。在命令行中的任何出现替换字符串的位置,都会插入我们提供给 xargs 的值 。

有点抽象,我们以一个实例来进行讲解。

我们先用 tree 命令查看当前目录中的子目录。该 -d(directory)选项使 tree 命令忽略文件,只输出目录。

$ tree -d

现在只有一个子目录 images 。

在 directories.txt 这个文件中,我们有一些想要创建的目录的名称。我们先用 cat 查看其中的内容。

$ cat directories.txt

我们把这些内容作为输入数据传给 xargs ,执行以下的命令:

$ cat directories.txt | xargs -I % sh -c 'echo %; mkdir %'

这条命令执行了以下操作:

  • cat directories.txt :将 directrories.txt 文件的内容(所有要创建的目录名称)传给 xargs
  • xargs -I % :定义了替换字符串 %
  • sh -c:启动一个新的子shell。-c(commond)让 shell 读取命令。
  • ‘echo %; mkdir %’:每个都会被替换为 xargs 传过来的目录名称 。echo命令打印目录名称,mkdir 命令创建目录。

命令执行结果:

我们可以用 tree 验证已创建是否已创建了目录。

$ tree -d

将文件复制到多个位置

我们可以使用 xargs 命令来用一个命令将文件复制到多个位置。

首先,通过管道将两个目录的名称传给 xargs 。并且让 xargs 一次只将其中一个参数传递给正在使用的命令。

想要调用 cp 两次,每次各使用两个目录中的一个作为命令行参数,我们可以通过将 xargs-n(max number)选项设置为 1 来实现。

这里还使用了-v(verbose 详细信息)选项,让 cp 反馈正在执行的操作。

$ echo ~/dir1/ ~/dir2/ | xargs -n 1 cp -v ./*.c

我们将文件复制到了两个目录,一次复制一个目录。cp 反馈了详细信息,让我们看到进行了哪些操作。

删除嵌套目录中的文件

如果文件名中包含空格或者其他特殊字符(例如换行符),xargs 将无法正确解释这些文件名。我们可以使用 -0(空终止符)选项来解决这一问题。此时, xargs 将使用 null 字符作为文件名最终的分隔符。

这里我们以 find 命令为例。find 有自己的选项来处理文件名中的空格和特殊字符,即 -print0(全名,空字符)选项。

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前在阿里

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以点击这里获取!

gDHk09-1714626955702)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以点击这里获取!

  • 14
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中的find和xargs命令通常一起使用,以便对匹配到的文件进行处理。find命令用于查找文件和目录,而xargs命令用于将find命令获取到的文件批量传递给其他命令进行处理。[1] 通过将find命令的输出传递给xargs命令xargs命令每次只获取一部分文件而不是全部,这样可以分批处理文件,避免因文件过多而导致溢出错误。 这对于那些对能传递给exec命令的参数长度有限制的系统尤其有用。 使用xargs命令的格式通常为: find <目录> <搜索条件> | xargs <命令> 其中,<目录>指定要搜索的目录,<搜索条件>指定要查找的文件类型、文件名等条件,<命令>是要对匹配到的文件进行的具体操作命令。 通过这种方式,我们可以方便地对匹配到的文件进行批量处理,比如复制、移动、删除等操作。同时,xargs命令还支持将find命令的输出作为命令行参数传递给其他命令,进一步扩展了命令的功能和灵活性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Linux命令-find命令xargs](https://blog.csdn.net/weixin_43727674/article/details/118223282)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [linux find命令xargs简单概述](https://download.csdn.net/download/weixin_38704922/12844570)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值