在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 文件,并将该列表传给了xargsxargs 将所有文件名传递给 wcwc 将这些文件名作为命令行参数进行处理。

使用带有确认消息的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 -0:xargs 也将考虑文件名以空值结尾,并且空格和特殊字符不会引起问题。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上使用xargs命令的文章就介绍到这了,更多相关Linux上使用xargs命令内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Linux基础之xargs命令的入门实例

    简介 xargs命令有两个要点.第一,你必须列出目标文件.第二,你必须指定对每个文件需要执行的命令或脚本. xargs命令被用来处理分布在不同目录下的文件: 计算所有文件的行数 打印指定文件的第一行 对每个文件执行一个自定义脚本 xargs可以将输入内容(通常通过命令行管道传递),转成后续命令的参数,通常用途有: 命令组合:尤其是一些命令不支持管道输入,比如ls. 避免参数过长:xargs可以通过-nx来将参数分组,避免参数过长. 使用语法如下 Usage: xargs [OPTION]...

  • linux shell脚本学习xargs命令使用详解

    xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据.xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代. xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,下面是一些如何有效使用xargs 的实用例子. 1.

  • Linux 下xargs命令详解及xargs与管道的区别

    为什么要用xargs,问题的来源 在工作中经常会接触到xargs命令,特别是在别人写的脚本里面也经常会遇到,但是却很容易与管道搞混淆,本篇会详细讲解到底什么是xargs命令,为什么要用xargs命令以及与管道的区别.为什么要用xargs呢,我们知道,linux命令可以从两个地方读取要处理的内容,一个是通过命令行参数,一个是标准输入.例如cat.grep就是这样的命令,举个例子: echo 'main' | cat test.cpp 这种情况下cat会输出test.cpp的内容,而不是'main'

  • Linux xargs命令的使用

    1.功能: xargs可以将stdin中以空格或换行符进行分隔的数据,形成以空格分隔的参数(arguments),传递给其他命令.因为以空格作为分隔符,所以有一些文件名或者其他意义的名词内含有空格的时候,xargs可能会误判.简单来说,xargs是给其他命令传递参数的一个过滤器,是构建单行命令的重要组件之一. 之所以要用到xargs,是因为由于很多命令不支持使用管道|来传递参数,例如: find /sbin -perm +700 |ls -l //这个命令是错误,因为标准输入不能作为ls的参数

  • Linux xargs命令详细介绍

     Linux xargs命令 1.功能: xargs可以将stdin中以空格或换行符进行分隔的数据,形成以空格分隔的参数(arguments),传递给其他命令.因为以空格作为分隔符,所以有一些文件名或者其他意义的名词内含有空格的时候,xargs可能会误判.简单来说,xargs是给其他命令传递参数的一个过滤器,是构建单行命令的重要组件之一. 之所以要用到xargs,是因为由于很多命令不支持使用管道|来传递参数,例如: find /sbin -perm +700 |ls -l //这个命令是错误,因

  • 在Linux上使用xargs命令的详细教程

    大家好,我是良许. 在使用 Linux 时,你是否遇到过需要将一些命令串在一起,但是其中一个命令不接受管道输入的情况呢?在这种情况下,我们就可以使用 xargs 命令.xargs 可以将一个命令的输出作为参数发送给另一个命令. 在 Linux 中,所有标准的应用程序都有与之关联的三个数据流.分别是标准输入流(stdin),标准输出流(stdout)和标准错误流(stderr).这些流通过文本来运行,我们使用文本将输入(stdin)发送到命令,然后响应(stdout)将会以文本形式显示在终端窗口上

  • PHP在linux上执行外部命令的方法

    目录: 一.PHP中调用外部命令介绍 二.关于安全问题 三.关于超时问题 四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍 在PHP中调用外部命令,可以用,1>调用专门函数.2>反引号.3>popen()函数打开进程,三种方法来实现: 方法一:用PHP提供的专门函数(四个): PHP提供4个专门的执行外部命令的函数:exec(), system(), passthru(), shell_exec() 1)exec() 原型: string exec ( st

  • 在linux上定期执行命令、脚本(cron,crontab,anacron)

    人类把时间做了切割,想象一条笔直的线永远向前,本来这条直线上什么都没有,但是人类根据时间的长短(单位)在这条直线上做了密密麻麻的标记(世纪-年-月-日-时-分-秒-纳秒......),通过这样的方式历史上的每一个时刻都能够被单独拿出来,而未来的每一个时刻也能被单独计划.更重要的是,每一个单独的时刻又能跟相邻的被更大单位所控制的相似时刻做比较,比如,今天的晚上12点跟明天的晚上12点,相似的是,两个时刻都是12点,不同的是今天跟明天,她们是相邻的更大单位.因为这样的缘故,在被更大单位所隔开的每一个

  • 在 Linux 上使用 Multitail命令的教程

    MultiTail是个用来实现同时监控多个文档.类似tail命令的功能的软件. 他和tail的区别就是他会在控制台中打开多个窗口,这样使同时监控多个日志文档成为可能. 什么是MultiTail MultiTail是一个开源的ncurses的实用工具,可用于在一个窗口或单一外壳,显示实时一样的尾巴命令,该命令拆分控制台为更多子窗口的日志文件的最后几行(很像显示多个日志文件到标准输出屏幕命令 ). 它还支持颜色突出显示,过滤,添加和删除窗口等. 特征 多个输入源. 在重要信息的情况下使用正则表达式的

  • VMware安装Linux CentOS 7.7系统的详细教程

    如何在Vmware安装Linux CentOS 7.7系统,并且是最小化安装.之后进行必要的配置修改,并实现基础优化.最后做一个快照. 安装Linux CentOS 7.7 安装要求:安装后的虚拟机用于服务器,因此要最小化安装,不要安装多余的软件,也不需要安装图形化界面. 虚拟机如何创建参见:「VMware如何创建虚拟机并设置虚拟机网络>」 启动虚拟机 安装CentOS 7 选择(通过上下键切换选项)第一个,安装CentOS 7 键盘及语言选择 选择键盘模式,选择语言以及语言所在国家(比如:美国

  • mysql8.0.23 linux(centos7)安装完整超详细教程

    上篇文章给大家介绍了MySQL 8.0.23 主要更新一览(新特征解读) ,感兴趣的朋友点击查看吧! 最新版windows mysql-8.0.23-winx64,点击下载 mysql8.0.23 linux(centos7)安装教程(附:配置外网连接用户授权 与 不区分大小写配置) (博主在这里叨叨几句,稍后进入正题.在使用开发过程中,有时候数据库结合使用,会成倍提高程序效率) 什么是关系型数据库? 常见的关系型数据库: (其实博主也只使用过 MySQL Oracle sqlServer) O

  • Linux下利用python实现语音识别详细教程

    目录 语音识别工作原理简介 选择合适的python语音识别包 安装SpeechRecognition 识别器类 音频文件的使用 英文的语音识别 噪音对语音识别的影响 麦克风的使用 中文的语音识别 小范围中文识别 语音合成 语音识别工作原理简介 语音识别源于 20 世纪 50 年代早期在贝尔实验室所做的研究.早期语音识别系统仅能识别单个讲话者以及只有约十几个单词的词汇量.现代语音识别系统已经取得了很大进步,可以识别多个讲话者,并且拥有识别多种语言的庞大词汇表.语音识别的首要部分当然是语音.通过麦克

  • Node.js入门教程:在windows和Linux上安装配置Node.js图文教程

    本章节我们将向大家介绍在window和Linux上安装Node.js的方法. 本安装教程以Node.js v0.10.26 版本为例. Node.js安装包及源码下载地址为:http://www.nodejs.org/download/. 根据不同平台系统选择你需要的Node.js安装包. 注意:Linux上安装Node.js需要安装Python 2.6 或 2.7 ,不建议安装Python 3.0以上版本. Windowv 上安装Node.js Windows 安装包(.msi) : 32 位

  • Linux下Python安装完成后使用pip命令的详细教程

    一.很多读者Python安装完成之后,想要下载相关的包,例如:numpy.pandas等Python中这些基础的包,但是,发现pip根本用不了,主要表现在一下几种情况: 二.出现这种情况其实并不意外,虽然Python3.6.3自带了pip,但是安装Python3.6.3之后还需要我们进行进一步的配置.下面配置pip3的环境变量. 配置完成之后,使之生效 三.现在可以进行Python包的安装了 进入python导入numpy包发现没有报错,说明安装成功. 四.如果不习惯用pip3进行下载的话也可以

随机推荐