大家好,我是良许。

在使用 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 文件,并创建了压缩文件。

总结

到此这篇关于如何在Linux上使用xargs命令的文章就介绍到这了,更多相关Linux上使用xargs命令内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/yychuyu/p/13556625.html

linux命令中xargs,在Linux上使用xargs命令的详细教程相关推荐

  1. Linux环境中Visual Studio Code 安装配置及其卸载(详细教程)

    两篇相关博文: 在VMware15中创建虚拟机安装ubuntu系统(超详细教程) Linux环境编译运行C/C++语言程序----配置gcc.g++(详细教程) 此篇分享我在linux环境下安装VS ...

  2. linux无密码sudo,在Linux系统中运行没有sudo密码的特定命令

    本文介绍在Linux操作系统中运行没有sudo密码的特定命令的方法. 背景 我在AWS上部署了Ubuntu系统上的脚本,此脚本的主要目的是检查特定服务是否以固定间隔运行(确切地说每隔一分钟),并且如果 ...

  3. linux 运行c b停止,以下Linux命令中,用于终止某个进程的命令是()。A.deadB.killC.quitD.exit...

    以下Linux命令中,用于终止某个进程的命令是().A.deadB.killC.quitD.exit 更多相关问题 The substance does not dissolve in water _ ...

  4. 在Windows和Linux系统中,有以下常用的磁盘修复命令

    在Windows和Linux系统中,有以下常用的磁盘修复命令: Windows系统: 1. CHKDSK命令:检查磁盘上的文件系统错误,并对损坏的扇区进行恢复.格式:CHKDSK [驱动器:] [参数 ...

  5. 解决Linux CentOS中cp -f 复制强制覆盖的命令无效的方法

    解决Linux CentOS中cp -f 复制强制覆盖的命令无效的方法 参考文章: (1)解决Linux CentOS中cp -f 复制强制覆盖的命令无效的方法 (2)https://www.cnbl ...

  6. linux python2.7安装教程_Linux中RedHat下安装Python2.7开发环境的详细教程-学派吧-

    这篇文章主要为大家详细介绍了Linux RedHat下安装Python2.7.pip.ipython环境.eclipse和PyDev环境,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 Linux ...

  7. mint linux更新内核,如何在Ubuntu/Linux Mint中安装最新Linux 5.2.5内核

    原标题:如何在Ubuntu/Linux Mint中安装最新Linux 5.2.5内核 Linux 5.2的Ubuntu主线内核包最终可以在32位和64位操作系统中下载和安装. 由于构建失败,Linux ...

  8. Linux环境CentOS6.9安装配置Elasticsearch6.2.2最全详细教程

    Linux环境CentOS6.9安装配置Elasticsearch6.2.2最全详细教程 前言 第一步:下载Elasticsearch6.2.2 第二步:创建应用程序目录 第四步:创建Elastics ...

  9. Github上传代码菜鸟超详细教程

    最近需要将课设代码上传到Github上,之前只是用来fork别人的代码. 这篇文章写得是windows下的使用方法. 第一步:创建Github新账户 第二步:新建仓库 第三部:填写名称,简介(可选), ...

  10. iphone照片恢复至android,绝招!如何恢复苹果/安卓手机上误删的照片,详细教程奉上!...

    原标题:绝招!如何恢复苹果/安卓手机上误删的照片,详细教程奉上! 经常是怕占内存 就把手机里的照片删除了 然后就是某一天 突然反悔了想把照片找回来 或是真的不小心就把照片误删了 小伙伴们有过这种烦恼吗 ...

最新文章

  1. 盘点那些最常用的Linux命令,都应该记熟!
  2. AI时代的中层支柱:统计学
  3. 函数式编程语言python-用Python进行基础的函数式编程的教程
  4. python 深拷贝_Python之类的浅拷贝与深拷贝
  5. 常用的C#正则表达式!
  6. centos 6.8安装git_Centos(6/7)安装GitLab超详细教程
  7. oracle数据库删除用户(schema)操作
  8. 拓端tecdat|R语言蒙特卡洛方法:方差分量的Metropolis Hastings(M-H)、吉布斯Gibbs采样比较分析
  9. 彻底搞懂git rebase命令
  10. Infopath入门到精通系列-1 Infopath文件说明
  11. DXGI中的flip显示模型
  12. PR卡点插件 Premiere自动卡点自动剪辑插件 音乐鼓点节拍插件BeatEdit v1.0.10.2+使用教程
  13. 【SQL】用SQL语句表示同比和环比
  14. Unity3d进阶学习(9)-- 本地化Localization
  15. iphone无法和android蓝牙,解决常见iPhone蓝牙不工作问题的10个技巧
  16. EXCEL如何批量调整图片大小?
  17. 阿里企业邮箱的smtp
  18. Aurora落地中国,AWS掀开中国新篇章
  19. TabLayout+ViewPager+Fragment实现切页展示
  20. FTXUI基础笔记(botton按钮组件进阶)

热门文章

  1. 10-1-数据库连接池
  2. mysql 表空间加密,MySql(8.0)基于docker部署(加密存储表空间)
  3. 倒N字形排列java_Java实现n位数字的全排列
  4. linux 重启服务器_linux入门-----6
  5. 华中数控机器人编程循环三次_华中数控:公司在数控技术上不断创新突破 在技术方面处于国内领先水平...
  6. mycat分片mysql_49 mycat分片集群mysql分片分表策略
  7. 服务器操作系统版本检查,服务器操作系统版本检查
  8. C语言回调函数 钩子函数,回调函数和钩子函数的说明
  9. CPL,RPL和DPL的关系
  10. IO Visor Project Use Cases