从示例中
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的教程,并通过man并行页面进行阅读。我能够收集一些基本知识,但不能准确地使用它或这样。
发布于 2019-05-13 00:29:02
让我们先做简单的事情。
反斜杠(\)只是告诉shell下一行是当前行的延续,大于号(>)是提示输入延续行的shell。它与输入没有什么不同:
echo \
hi在那里你会看到这个:
echo \
> hi
hi因此,我的意思是您可以忽略\>,只在一行上运行该命令。
接下来,介绍{}中的内容。这些在GNU Parallel手册页中进行了描述,但本质上是:
{1}引用第一个parameter{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个子目录。
https://stackoverflow.com/questions/56000665
复制相似问题