关于linux:如何在Linux上使用xargs命令

3次阅读

共计 3420 个字符,预计需要花费 9 分钟才能阅读完成。

大家好,我是良许。

在应用 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 开发学习路线图

也心愿有小伙伴能退出我,把这份电子书做得更完满!

有播种?心愿老铁们来个三连击,给更多的人看到这篇文章

举荐浏览:

  • 干货 | 程序员进阶架构师必备资源免费送
  • 神器 | 反对搜寻的资源网站
正文完
 0