从示例
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开始阅读本教程,并通读并行页面。我能够收集一些基本知识,但不能确切地知道如何使用它。
答案 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个子目录。