首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GNU并行参数

GNU并行参数
EN

Stack Overflow用户
提问于 2019-05-06 15:33:07
回答 1查看 1.6K关注 0票数 4

从示例中

代码语言:javascript
复制
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并行页面进行阅读。我能够收集一些基本知识,但不能准确地使用它或这样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-13 00:29:02

让我们先做简单的事情。

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

代码语言:javascript
复制
echo \
hi

在那里你会看到这个:

代码语言:javascript
复制
echo \
> hi
hi

因此,我的意思是您可以忽略\>,只在一行上运行该命令。

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

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

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

代码语言:javascript
复制
echo A B | parallel --colsep ' ' echo {2} {1}
B A

  • {.}是指参数,通常是文件名,但在

中删除了其扩展名

使用以下命令进行测试:

代码语言:javascript
复制
echo fred.dat | parallel echo {.}
fred

现在让我们来看一个实际的问题,去掉上面描述的继续行,并将所有内容放在一行上:

代码语言:javascript
复制
seq 1 100 | parallel -I @@ 'mkdir top-@@;seq 1 100 | parallel -X mkdir top-@@/sub-{}'

因此,这实际上是在运行:

代码语言:javascript
复制
seq 1 100 | parallel -I @@ 'ANOTHER COMMAND'

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

第二个并行命令与第一个命令基本相同,但在这里Ole使用了X。如果你看了你链接的视频,你会看到他之前向你展示了它是如何工作的。它实际上根据系统的ARGMAX将“尽可能多的参数”传递给一个命令。因此,如果您希望创建10,000个目录,而不是这样:

代码语言:javascript
复制
seq 1 10000 | parallel mkdir {}

它将启动10,000个单独的进程,每个进程都运行mkdir,您将启动一个mkdir,但带有10,000个参数:

代码语言:javascript
复制
seq 1 10000 | parallel -X mkdir

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

现在让我们看一下外部的parallel调用,并进行一次演练,看看它会做什么,而不实际做任何事情:

代码语言:javascript
复制
seq 1 100 | parallel -k --dry-run -I @@ 'mkdir top-@@;seq 1 100 | parallel -X mkdir top-@@/sub-{}'

输出

代码语言:javascript
复制
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个子目录。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56000665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档