【问题标题】:GNU parallel argumentsGNU 并行参数
【发布时间】:2019-09-23 19:43:19
【问题描述】:

从例子中

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 并行页面。我能够收集一些基本知识,但不知道如何使用它。

【问题讨论】:

  • 用鼠标选中代码,然后单击格式工具栏中粗体斜体旁边标有{}的按钮来标记代码。
  • 马克,我已经用斜体突出显示了代码。
  • 如你所愿,但我怀疑如果你像 StackOverflow 上其他 1200 万个问题一样格式化它,你会做得更好......
  • 我相信新的格式就是你提到的马克。

标签: gnu-parallel


【解决方案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 个子目录。

【讨论】:

  • 嗨!抱歉迟到了。这个效果很好。但是,我注意到以下 1) echo fred.dat | parallel echo {.} 当我尝试执行类似的操作时,我得到了“。”和 以相反的顺序作为“。” 分别。有什么理由让我以相反的方式得到它?
  • 执行命令时 - echo A B | parallel --colsep ' ' echo {2} {1} ,我得到的输出为 2 1 A B 。有什么理由吗?
  • 您是否正在运行旧版本?试试parallel --version,你应该会得到类似20190522 的东西,它是2019 版本。
  • 我好像在运行一个旧版本 - 20180422。但是,这是否已经足够大,可以单独工作了?
  • 也许可以尝试将--gnu 添加到所有命令中,例如parallel --gnu ... 如果您有 tollef 版本。
猜你喜欢
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 2018-02-28
相关资源
最近更新 更多