GNU并行参数

时间:2019-05-06 07:33:07

标签: gnu-parallel

从示例

seq 1 100 | parallel -I @@ \ > 'mkdir top-@@;seq 1 100 | parallel -X mkdir top-@@/sub-{}

-X , @@, {}如何工作?同样,当为“ 1”或“。”时,行为将是什么?在{}内部传递? />此处用于重定向吗?

我试图从https://www.youtube.com/watch?v=P40akGWJ_gY&list=PL284C9FF2488BC6D1&index=2开始阅读本教程,并通读并行页面。我能够收集一些基本知识,但不能确切地知道如何使用它。

1 个答案:

答案 0 :(得分:1)

让我们先做简单的事情。

反斜杠(\)只是告诉shell下一行是当前行的延续,而大于号(>)是shell提示继续行的提示。与输入没有什么不同

echo \
hi

您将实际看到的位置:

echo \
> hi
hi

因此,我是说您可以忽略\>并仅在一行上运行命令。


接下来,{}中的内容。这些在 GNU Parallel 手册页中进行了介绍,但实际上是:

  • {1}是第一个参数
  • {2}引用第二个参数,依此类推

使用以下命令对此进行测试,其中列分隔符设置为空格,但我们以相反的顺序使用参数:

echo A B | parallel --colsep ' ' echo {2} {1}
B A

  • {.}是指参数,通常是文件名,其扩展名已删除

使用以下方法进行测试:

echo fred.dat | parallel echo {.}
fred

现在我们来看一个实际的问题,如上所述,删除续行,并将所有内容都放在一行:

seq 1 100 | parallel -I @@ 'mkdir top-@@;seq 1 100 | parallel -X mkdir top-@@/sub-{}'

因此,它实际上正在运行:

seq 1 100 | parallel -I @@ 'ANOTHER COMMAND'

Ole在此命令中使用@@代替{},以使第二个内部并行命令中使用的替换不会相互混淆。因此,在看到@@的地方,只需要用第一个seq 1 100中的值替换即可。

第二个并行命令与第一个并行命令几乎相同,但是Ole在这里使用了X。如果您观看链接到的视频,您将看到他以前向您展示了它的工作原理。实际上,它根据系统的ARGMAX“尽可能多的参数” 传递给命令。因此,如果要创建10,000个目录,请执行以下操作:

seq 1 10000 | parallel mkdir {}

这将启动10,000个独立的进程,每个进程运行mkdir,您将启动一个mkdir,但具有10,000个参数:

seq 1 10000 | parallel -X mkdir

这避免了创建10,000个独立进程的需要,并加快了处理速度。


现在让我们看一下外部的parallel调用,然后试运行一下,看看它会做什么,而实际上并没有做任何事情:

seq 1 100 | parallel -k --dry-run -I @@ 'mkdir top-@@;seq 1 100 | parallel -X mkdir top-@@/sub-{}'

输出

mkdir top-1;seq 1 100 | parallel -X mkdir top-1/sub-{}
mkdir top-2;seq 1 100 | parallel -X mkdir top-2/sub-{}
mkdir top-3;seq 1 100 | parallel -X mkdir top-3/sub-{}
mkdir top-4;seq 1 100 | parallel -X mkdir top-4/sub-{}
mkdir top-5;seq 1 100 | parallel -X mkdir top-5/sub-{}
mkdir top-6;seq 1 100 | parallel -X mkdir top-6/sub-{}
mkdir top-7;seq 1 100 | parallel -X mkdir top-7/sub-{}
mkdir top-8;seq 1 100 | parallel -X mkdir top-8/sub-{}
...
...
mkdir top-99;seq 1 100 | parallel -X mkdir top-99/sub-{}
mkdir top-100;seq 1 100 | parallel -X mkdir top-100/sub-{}

因此,现在您可以看到它将启动100个进程,每个进程将创建一个目录,然后启动100个其他进程,每个进程将创建100个子目录。