`

[zz]关于xargs,你可能不知道的

 
阅读更多
如果你曾经花了许多时间在Unix命令行上,那么或许你已经见过xargs了,如果你还没听过xargs,那就先让我来解释下,xargs是一个从标准输入或许参数并执行命令的程序。

常见使用

我常常见到将find和xargs组合使用以对find返回的文件列表执行某些操作。

更新:根据Twitter和hacker news上的反馈,find是个很强大的命令,它自己也有-exec和-delete这样的参数可以用来执行命令和删除文件,尽管如此,如果你对find的这些选项不太了解,或是想不起来-exec那古怪的语法,那么你还是可以使用更为简单的xargs,并且xargs在效率上也更胜一筹。

递归查找所有Python文件并统计文件行数

find . -name ‘*.py’ | xargs wc -l

递归查找所有Emacs备份文件并删除:

find . -name ‘*~’ | xargs rm

递归查找所有Python文件并搜索import语句:

find . -name ‘*.py’ | xargs grep ‘import’

处理文件/目录名中的空格

上面的例子有一个问题,如果文件或是目录名含有空格,则可能会有些问题,这是因为xargs默认会按照空白自负来划分输入。一个简单的解决办法就是告诉find使用NUL(\0)来分割结果(通过向find提供-print0选项),并且告诉xargs也使用Nul来分隔输入(-0)。

删除备份文件,即使含有空格:

find . -name ‘*~’ -print0 | xargs -0 rm

参数位置

上面的例子中xargs从标准输入读取所有非空的元素并将他们连接起来提供给给定的命令进行执行,这在很多情况下会非常有用,尽管如此,有时你可能想要在命令中间插入一个参数,此时-J标记就排上用场了,xargs会为-J参数后面的字符串加上输入然后在执行。

将所有备份文件复制到backups目录下:

find . -name ‘*~’ -print 0 | xargs -0 -J % cp % ~/backups

最大命令长度

有时通过管道传递给xargs的输入可能会造成要执行的命令超出最大命令行长度限制,你可以通过下面的命令得到命令行的最大长度:

getconf ARG_MAX

为了避免越限,xargs对于结果命令有它自己的最大长度限制,如果提供的参数有可能会造成调用的命令超出长度限制,则xargs会将输入分割成多个部分,并多次调用目标命令,默认的长度限制是4096,这可能要远远小于大多数现在系统的ARG_MAX设置,你可以通过向xargs提供-s标识来覆盖这个默认设置,当你对一个很大的源代码仓库进行操作时,这会显得尤其有用。

指定参数数量

如果你要执行的命令只接受1个或是2个参数,比如使用diff命令来对2个文件进行比较,那么xargs的-n选项就会非常有用,它可以指定一次向目标命令提供几个参数,如果参数数量多于你制定的数量,则命令将会被重复调用,直到所有输入都已经得到执行。注意,最后一次调用的参数有可能会少于指定的参数数量,下面让我们来看一个简单的例子:

$ echo {0..9} | xargs -n 2

0 1
2 3
4 5
6 7
8 9

同样的,你也可以使用-L参数制定每次只对某几行的输入进行操作,比如-L 1将每次从输入中取一行作为参数传递给待执行的命令,当然,你可以将1改为任意行,但1是最常用的,下面这条命令将演示如何得到每个git commit的代码变化:

git log –format=”%H %P” | xargs -L 1 git diff

并行执行命令

你或许会使用xargs调用某些需要密集计算的命令,如果xargs可以利用你电脑上的多核计算能力,那该有多美妙?没错,-P参数就是干这个的,通过这个参数xargs可以一次并行的调用多个命令,举个例子,你可以通过它来并行的运行多个ffmpeg编码器,不过,还是让我们来个更简单一点的例子吧:

并行休眠

$ time echo {1..5} | xargs -n 1 -P 5 sleep

real 0m5.013s
user 0m0.003s
sys 0m0.014s

线性休眠

$ time echo {1..5} | xargs -n 1 sleep

real 0m15.022s
user 0m0.004s
sys 0m0.015s

如果你对使用xargs进行并行计算感兴趣,那么你或许应该看看GNU parallel,相比较而言,xargs的优势就是大多数系统默认都支持它,并且在BSD和OS X上也可以很容易的安装,但是parallel则有许多非常赞的特性。
分享到:
评论

相关推荐

    xargs_for_window

    在Windows上,原生并不包含`xargs`命令,但可以通过安装一些第三方工具来实现类似的功能。 **xargs的基本概念与作用** `xargs`的主要用途是将一系列的数据转换为命令行参数,这在处理大量文件、进行批量操作或者...

    可在windows使用的类linux工具xargs

    在Windows操作系统中,由于其与Linux环境的差异,很多Linux用户可能会感到不适应,特别是对于习惯使用命令行工具的人来说。然而,有一款名为`xargs`的工具,它为Windows用户提供了类Linux的体验,使得在Windows上...

    windows dos下xargs使用

    1. **文件名处理**:假设你有一个包含大量文件名的文本文件,比如`filelist.txt`,你可以用`xargs`配合`rm`命令删除这些文件: ```bash cat filelist.txt | xargs rm ``` 这个命令会逐行读取`filelist.txt`中的...

    Linux xargs 命令用法详解

    Linux xargs 命令 xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。 xargs 可以将管道或标准输入(stdin)数据转换...之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作

    xargs的简单应用

    只要介绍XARGS的应用

    Linux中xargs命令的使用方式.doc

    以下是关于`xargs`命令的详细解释和使用方法。 1. **基本概念** `xargs`是一个过滤器,它从管道或标准输入接收数据,然后将这些数据作为参数传递给指定的命令。默认情况下,`xargs`会将输入的行分割成单词,每个...

    Linux文件查找命令find,xargs详述

    例如,使用`-exec`删除所有匹配的文件可能需要用户确认,而通过`xargs`传递给`rm`命令则可以直接删除。基本用法如下: ```bash find . -type f -print0 | xargs -0 rm -f ``` 在这个例子中,`-print0`和`-0`分别...

    linux个人积累-xargs

    xargs

    【IT十八掌徐培成】Linux基础-04.xargs-mount-umount.zip

    例如,当你需要对文件列表执行操作,如删除、重命名等,xargs可以高效地完成任务。基本使用格式是`find . -type f -name 'pattern' | xargs command`,其中find命令用于查找符合特定条件的文件,然后通过管道(|)...

    find命令和xargs命令配合使用

    find命令和xargs命令配合使用,自己总结的,觉得还好

    Linux_的命令find_xargs详述(2).txt

    ### Linux的find与xargs命令详解 在Linux系统中,`find`与`xargs`是两个非常强大的命令行工具,它们分别用于查找文件...无论是查找文件、批量修改权限还是执行其他数据处理任务,`find`与`xargs`都是不可或缺的工具。

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

    其中,`command`是你想要执行的命令,`option`是`xargs`的一些选项,用来控制`xargs`的行为,而第二个`command`是指向`xargs`传递的命令,通常省略。 **常用选项:** - `-d delimiter`:使用分隔符`delimiter`代替...

    Go-xargs的JSON流

    对于可能产生的错误,`Go-xargs`会停止处理并返回第一个错误,确保问题能得到及时反馈。 总的来说,`Go-xargs`是Go开发中的一个实用工具,尤其适用于需要处理JSON数据流的场景。通过它,我们可以充分利用Go的并发...

    Linux xargs命令详细介绍

    因为以空格作为分隔符,所以有一些文件名或者其他意义的名词内含有空格的时候,xargs可能会误判。简单来说,xargs是给其他命令传递参数的一个过滤器,是构建单行命令的重要组件之一。 之所以要用到xargs,是因为由于...

    xargs命令 过滤器

    xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者 stdin 并将其转换成特定命令的命令参数。 xargs也可以将单行或多行文本...

    linux中xargs命令的各种使用技巧

    然而,当文件名包含空格时,直接使用`xargs`可能会出现问题。为了解决这个问题,`find`提供了`-print0`选项,它使用`\0`作为分隔符,而`xargs`的`-0`选项可以匹配这种分隔符: ```bash [root@host1 test]# find . -...

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

    `xargs`命令的灵活性和实用性使得它成为Linux Shell脚本中不可或缺的一部分,它能帮助我们高效地处理大量数据和文件操作,尤其在自动化任务和脚本编程中。理解并熟练掌握`xargs`的使用,将大大提高你的Linux命令行...

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

    命令组合:尤其是一些命令不支持管道输入,比如ls。 避免参数过长:xargs可以通过-nx来将参数分组,避免参数过长。 使用语法如下 Usage: xargs [OPTION]... COMMAND INITIAL-ARGS... Run COMMAND wi

    git-xargs:git-xargs 是一个命令行工具 (CLI),用于使用单个命令跨多个 Github 存储库进行更新

    你给git-xargs : 要运行的脚本或命令 回购清单 和git-xargs将: 克隆每个 repo 针对它运行您指定的脚本或命令 提交任何更改 打开拉取请求 提供所发生的一切的详细报告 Git-xargs 利用 goroutines 并行执行 repo...

Global site tag (gtag.js) - Google Analytics