更好地理解xargs

时间:2009-07-13 20:13:26

标签: shell xargs

我想了解Rampion's codexargs man的使用情况:

screen -t man /bin/sh -c 'xargs man || read'

感谢Rampion:我们不需要猫!

为什么我们在命令中需要xargs

我理解xargs -part如下

  1. cat to xargs
  2. xargs列出man -commands
  3. 我有一个想法,xargs列出了命令。例如,

    find . -type f -print0 | xargs -0 grep masi 
    

    与命令列表相同:

    find fileA AND grep masi in it 
    find fileB AND grep masi in it 
               and so on for fileC, fileD, ...
    

3 个答案:

答案 0 :(得分:4)

不,我没有cat没有。我在运行命令后得到了任何输入。 cat在这里实际上是无关紧要的,所以让我们忽略它。

xargs man等待用户输入。这是必要的。因为你在脚本中抓住了它,所以在创建窗口之前我不能粘贴man的参数。因此,在窗口中运行的命令需要等待我给它一些东西,然后再尝试运行man。

如果我们刚刚运行screen /bin/sh -d 'man || read',它会一直抱怨“您想要哪个手册页?”因为我们从来没有告诉它。

答案 1 :(得分:3)

xargs从stdin收集参数并执行用这些参数给出的命令。

因此cat正在等待输入的内容,然后xargs正在运行带有该输入的人。

如果要处理大量文件,xargs很有用,我经常将它与find的输出一起使用。 xargs将尽可能多的参数填充到命令行中 这对于做像

这样的事情很棒
find . -name '*.o' -print | xargs rm

答案 2 :(得分:3)

cat命令无法运行;它在标准输入上运行,直到它被告知输入结束。正如Rampion指出的那样,cat命令在这里不是必需的,但它是在其隐式输入(标准输入)上运行,而不是在任何情况下运行。

xargs命令从cat读取输出,并将信息分组为man命令的参数,并将其指定为(仅)参数。当它达到限制(在命令行上可配置)时,它将执行man命令。

find ... -print0 | xargs -0 ...成语处理包含空白字符(如空格,制表符和换行符)的文件名。 find命令打印每个文件名,后跟ASCII NUL('\0');这是两个不能出现在简单文件名中的字符之一 - 另一个是'/'(当然,它出现在路径名中,但不是简单的文件名)。它不直接等同于您提供的序列; xargs将文件名集合分组到单个参数列表中,最大为大小限制。如果名称足够短(通常是),那么grep的执行次数将少于文件名。

另请注意,grep仅打印找到材料的文件名(如果有多个要搜索的文件),或者它是否支持选项以便始终打印文件名和使用选项:'-H'是grep的GNU扩展,可以执行此操作。确保始终显示文件名的可移植方法是将/dev/null列为第一个文件(所以'xargs grep something /dev/null');搜索/dev/null不需要很长时间。