大家好,我是良许。

在使用 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(全名,空字符)选项。

$ find . -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}"

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

  • find . -name “*.png”find 将从当前目录中搜索名称和 *.png 相匹配的对象,type -f 指定了只搜索文件。
  • -print0:名称将以空字符结尾,并且保留空格和特殊字符。
  • xargs -0xargs 也将考虑文件名以空值结尾,并且空格和特殊字符不会引起问题。
  • rm -v -rf "{}"rm 将反馈正在进行的操作(-v),递归进行操作(-r),不发送错误提示而直接删除文件(-f)。每个文件名替换 "{}"。

命令执行之后,将搜索了所有子目录,删除了其中匹配的文件。

删除嵌套目录

假设我们要删除一组嵌套的子目录,先用tree进行查看。

$ tree -d

$ find . -name "level_one" -type d -print0 | xargs -0 rm -v -rf "{}"

这条命令使用 find 在当前目录中递归搜索,搜索的目标是名为 level_one 的目录,然后将目录名通过xargs传递给 rm

这个命令和前面的命令之间的区别是,搜索的项目是最顶层目录的名称,而且-type d说明要查找的目录,而不是文件。

每个目录的名称都在删除时打印出来。我们可以用tree再查看效果:

$ tree -d

所有嵌套的子目录已删除了。

删除一种文件类型以外的所有文件

我们可以使用 findxargsrm 删除所有类型的文件而只保留一种我们想要保留的类型的文件。这需要提供想要保留的文件类型。

-not 选项让 find 返回所有与搜索模式不匹配的文件名。我们此时再次使用 xargs-I (初始参数)选项。这次定义的替换字符串为 {} 。这和我们之前使用的替换字符串 % 的效果是相同的。

$ find . -type f -not -name "*.sh" -print0 | xargs -0 -I {} rm -v {}

命令执行之后,我们再通过 ls 来确认结果。可以看到,目录中只剩下了与 *.sh 相匹配的文件。

$ ls -l

使用Xargs创建压缩文件

我们可以使用 find 命令来搜索文件,并通过 xargs 将文件名传给 tar 命令来创建压缩文件。

我们将在当前目录中搜索 * .sh 文件。

$ find ./ -name "*.sh" -type f -print0 | xargs -0 tar -cvzf script_files.tar.gz

命令执行结果将列出了所有 .sh 文件,并创建了压缩文件。


公众号:良许Linux

有收获?希望老铁们来个三连击,给更多的人看到这篇文章

如何在Linux上使用xargs命令的更多相关文章

  1. 如何在Linux上使用scp命令进行服务器之间的文件/目录传输

    1. 本地上传文件到远程: scp [local_file_path] [username]@[server_ip]:[remote_dir] 2. 本地上传目录到远程: scp -r [local_ ...

  2. 如何在 Linux 上复制文件/文件夹到远程系统?

    从一个服务器复制文件到另一个服务器,或者从本地到远程复制是 Linux 管理员的日常任务之一. 我觉得不会有人不同意,因为无论在哪里这都是你的日常操作之一.有很多办法都能处理这个任务,我们试着加以概括 ...

  3. [转帖]如何在Linux上使用命令行查看硬件信息

    如何在Linux上使用命令行查看硬件信息 时间:2016-01-13   作者:admin 分类:新手入门 阅读:126次 http://embeddedlinux.org.cn/emb-linux/ ...

  4. 如何在Linux上通过grub添加内核参数

    转自Linux中国 我们可以在linux内核启动时为其提供各种各样的参数.这些参数可以自定义内核默认的行为,或者通知内核关于硬件的配置信息.内核参数应在内核启动时通过引导装载程序,如GRUB或LILO ...

  5. 如何在Linux上使用VIM进行.Net Core开发

    对于在Linux上开发.Net Core的程序员来说, 似乎都缺少一个好的IDE. Windows上有Visual Studio, Mac上有Visual Studio for Mac, 难道Linu ...

  6. springboot打成的jar包如何在Linux上持久运行

    一.首先说说在没有springboot的时候,项目是如何部署的? 1.动态web项目 动态web项目部署很方便,基本上上传文件到服务器的tomcat里面的webapps文件夹下即可完成部署.当然了,这 ...

  7. 如何在Linux上清理内存缓存、缓冲与交换空间

    如何在Linux上清理内存缓存.缓冲与交换空间 与其他类型的操作系统一样,GNU/Linux已经有效的实现了内存管理,甚至更加优秀.但是如果任何进程正在吃光你的内存,并且你想清理它,Linux提供了一 ...

  8. 如何在 Linux 上设置密码策略

    https://linux.cn/article-2518-1.html 用户帐号管理是系统管理员最重要的工作之一.而密码安全是系统安全中最受关注的一块.在本教程中,我将为大家介绍如何在 Linux ...

  9. 如何在 Linux 上安装应用程序

    如何在 Linux 上安装应用程序 编译自:https://opensource.com/article/18/1/how-install-apps-linux作者: Seth Kenlon原创:LC ...

随机推荐

  1. SpringCloud Bus消息总线简介

    简介: SpringCloud Bus配合SpringCloud Config使用可以实现配置的动态刷新 SpringCloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了 ...

  2. dubbo泛化调用 小demo

    前两天刚好有个同事来问是否用过 dubbo泛化 调用,不需要通过指定配置.第一次听到的时候,还是有点懵,但觉得有意思,可以学点东西. 立马百度了,找了demo,这篇比较容易上手(http://www. ...

  3. Django学习路8_学生表和班级表级联并相互查询信息

    在创建好的 app3 目录下的 models.py 中 创建对 数据表(学生和班级)的描述 分析: 学生和班级是一对多的关系 班级表的设计 class Grade(models.Model): # 设 ...

  4. PHP is_executable() 函数

    定义和用法 is_executable() 函数检查指定的文件是否可执行. 如果文件可执行,该函数返回 TRUE. 语法 is_executable(file) 参数 描述 file 必需.规定要检查 ...

  5. RESTFUL风格的URL请求及参数接收

    RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义.RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源 ...

  6. 从jdbc到spring-boot-starter-jdbc

    从jdbc到spring-boot-starter-jdbc jdbc 是什么 JDBC是一种用于执行SQL语句的API,可以为多种关系数据库提供统一访问,它是由一组用Java语言编写的类和接口.是J ...

  7. XSSFWorkbook

    支持2007以后的 此类与HSSFWorkbook(支持2007之前) 类似,读取文件时把全部的内容都存放到内存中,关闭输入流后. 内存与硬盘完全是毫无关系的两份数据,所有的操作都是对内存的操作,最后 ...

  8. 网络安全传输系统-sprint3账号管理子系统设计

    part1:sqlite嵌入式数据库移植 1.数据库系统构成:访问数据库应用-->管理数据库系统-->数据库存储(自上而下) 2.数据库中数据以表的形式而存在.表与表之间可能存在关联关系( ...

  9. 《第22条军规》Catch-22

    也许我们能注意到,英语里“军规”和“圈套”是同一个词. <第二十二条军规>是约瑟夫·海勒的代表作,小说以第二次世界大战期间驻扎在皮亚诺扎岛上的一支美国飞行队为背景,描写飞行员约瑟连(YOY ...

  10. Linux常用命令之用户权限管理chmod、chown、chgrp、umask命令讲解

    这节课我们重点来学习权限管理命令,说到权限大家可能第一时间能想到的就是读.写.执行 rwx 三种权限,在正式讲解权限命令之前,先简单的介绍一下rwx权限对于文件和目录的不同含义. 权限字符 权限 对文 ...