在Linux上使用xargs命令的详细教程
作者:良许Linux 发布时间:2022-12-19 01:54:05
大家好,我是良许。
在使用 Linux 时,你是否遇到过需要将一些命令串在一起,但是其中一个命令不接受管道输入的情况呢?在这种情况下,我们就可以使用 xargs
命令。xargs
可以将一个命令的输出作为参数发送给另一个命令。
在 Linux 中,所有标准的应用程序都有与之关联的三个数据流。分别是标准输入流(stdin),标准输出流(stdout)和标准错误流(stderr)。这些流通过文本来运行,我们使用文本将输入(stdin)发送到命令,然后响应(stdout)将会以文本形式显示在终端窗口上。错误消息也以文本的形式显示在终端窗口上(stderr)。
Linux 和类 Unix 操作系统的一大功能是可以将一个命令的标准输出流传递到另一个命令的标准输入流。第一个命令不会管它的输出是否写到了终端窗口,第二个命令也不会管它的输入是否来自键盘。
虽然所有 Linux 命令都有三个标准流,但是并不是所有命令都接受另一个命令的标准输出作为它的标准输入流的输入。因此我们无法通过管道将输入传给这些命令。
xargs
是一个使用标准数据流构建执行管道的命令。通过使用xargs
命令我们可以使 echo
,rm
和 mkdir
等命令接受标准输入作为它们的参数。
xargs命令
xargs
接受管道输入,也可以接受来自文件的输入。xargs
使用该输入作为我们指定的命令的参数。如果我们没有给xargs
指定特定的命令,则默认使用 echo
。xargs
始终生成单行输出,即使输入的数据是多行的。
假如我们使用 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
等待我们输入 y
或 Y
,n
或 N
并按 Enter 来响应。如果只按了 Enter
,则视为 n
。只有当我们当输入 y
或 Y
时才执行该命令。
我们按下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
所有嵌套的子目录已删除了。
删除一种文件类型以外的所有文件
我们可以使用 find
,xargs
和 rm
删除所有类型的文件而只保留一种我们想要保留的类型的文件。这需要提供想要保留的文件类型。
-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 文件,并创建了压缩文件。
来源:https://www.cnblogs.com/yychuyu/p/13556625.html
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 博客程序从Z-blog到WordPress的转换过程全纪录:1.前期准备网站未做,空间先找。我曾考虑过国外主机,由于有被墙的风险,访问速度也
- 一个无厘头“水帖”成网民狂欢时刻24小时点击超700万,回帖超30万,成就网络匪夷所思“奇迹”7月16日早上10点59分,是一个见证“奇迹”
- 每过几年,企业都要对网站进行改版设计。有时,企业对网站改版以新战略或是新产品的推出为契机。有时,企业只是不喜欢旧的网站才进行改版。或许,企业
- 引言:Exchange Server 2007提供了一个新的邮件兼容工具,称作传输规则机制。这种机制允许管理员对来自内外部的邮件信息采用策略
- 我们知道Google之前有发布一份“Google搜索引擎优化指南”,而近期百度也在百度创业者俱乐部发布了官方首份“百度搜索引擎优化指南”。这
- Windows 2003 IIS6 .ASP目录执行漏洞专题Windows 2003 Enterprise Edition是微软目前主流的服
- 1.先决条件1.1 支持平台GNU/Linux是产品开发和运行的平台。 Hadoop已在有2000个节点的GNU/Linux主机组成的集群系
- windows系统安装虚拟机,常见的是利用VMware Workstation这款软件来进行安装。在未接触Docker之前,我一直通过这款软
- 11月26日消息,谷歌宣布翻译工具(http://translate.g.cn 或者 http://翻译.g.cn)今日全新改版,除了整体产
- 有很多发布商给我们来信询问当月会不会向他付款。我们知道我们的付款流程比较复杂,很多发布商还不太了解。所以今天我们就对我们的付款流程做一个直观
- 3、与MySQL结合的配置及数据表结构注意:配置mysql相关部分要写127.0.0.1而不要写localhost,如果使用localhos
- 一、简介rsync 是一个常用的 Linux 应用程序,用于文件同步。它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不
- 为了方便不熟悉英文的朋友,我特地将购买Inmotion主机的流程用图文并茂加注解的方式演示一遍。1、点击这里进入Inmotion官方网站2、
- OpenStack Heat AutoScaling一、背景Openstack的Heat是在H版之后加入的组件,旨在创建一套业务流程,更轻松
- 一、安装POP3和SMTP服务组件Windows Server 2003默认情况下是没有安装POP3和SMTP服务组件的,因此我们要手工添加
- 本期教程笔者为大家讲解在Discuz! 7.1下如何给通过WAP发布的帖子加标记。如果回复或者主题是通过wap发布的,则在帖子信息中显示出来
- 用户体验要素看到15页了,感觉我在一个个字的去品位,把功夫用到细处,就想一个网站对用户的展示也是这样,注重点在于细节的描写。感觉用户体验和S
- DedeCms 是公认的在SEO优化方面做得做好的CMS,可能很多人会说,优化是靠个人的,与CMS无关,这其实也不尽正确,因为必须程序提供商
- 通过下面 10 步来保护 IIS:1.为IIS 应用程序和数据专门安装一个NTFS 设备。如果有可能,不要允许IUSER(或其它任何匿名用户
- 选择服务器是一项重大决策,通常费时费钱。错误的决策会导致不良后果。在本文中,我们将首先谈谈一些在规划时需考虑的问题,然后进一步讨论如何在Wi