GNU 并行参数
GNU parallel arguments
来自示例
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 中的教程并阅读手册平行页面。我能够收集一些基本知识,但不知道如何使用它。
让我们先做简单的事情。
反斜杠(\)
只是告诉shell下一行是当前行的延续,大于号(>
)是shell 提示输入续行。和打字没什么区别:
echo \
hi
你会在哪里看到这个:
echo \
> hi
hi
所以,我是说您可以忽略 \>
,只在一行中 运行 命令。
接下来是{}
中的事情。这些在 GNU Parallel 手册页中有描述,但本质上:
{1}
指第一个参数
{2}
指的是第二个参数,以此类推
使用以下列分隔符设置为 space 进行测试,但我们以相反的顺序使用参数:
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-{}'
所以,这本质上是 运行ning:
seq 1 100 | parallel -I @@ 'ANOTHER COMMAND'
Ole 在此命令中使用 @@
代替 {}
,这样第二个内部并行命令中使用的替换不会相互混淆。因此,在您看到 @@
的地方,您只需将其替换为第一个 seq 1 100
.
中的值
第二个并行命令与第一个命令几乎相同,但是Ole在这里使用了X
。如果您观看 link 观看的视频,您会发现他之前曾向您展示过它是如何工作的。它实际上根据系统的ARGMAX
将"as many parameters as possible"传递给一个命令。所以,如果你想创建 10,000 个目录,而不是这样:
seq 1 10000 | parallel mkdir {}
这将启动 10,000 个单独的进程,每个 运行ning 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 个子目录。
来自示例
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 中的教程并阅读手册平行页面。我能够收集一些基本知识,但不知道如何使用它。
让我们先做简单的事情。
反斜杠(\)
只是告诉shell下一行是当前行的延续,大于号(>
)是shell 提示输入续行。和打字没什么区别:
echo \
hi
你会在哪里看到这个:
echo \
> hi
hi
所以,我是说您可以忽略 \>
,只在一行中 运行 命令。
接下来是{}
中的事情。这些在 GNU Parallel 手册页中有描述,但本质上:
{1}
指第一个参数{2}
指的是第二个参数,以此类推
使用以下列分隔符设置为 space 进行测试,但我们以相反的顺序使用参数:
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-{}'
所以,这本质上是 运行ning:
seq 1 100 | parallel -I @@ 'ANOTHER COMMAND'
Ole 在此命令中使用 @@
代替 {}
,这样第二个内部并行命令中使用的替换不会相互混淆。因此,在您看到 @@
的地方,您只需将其替换为第一个 seq 1 100
.
第二个并行命令与第一个命令几乎相同,但是Ole在这里使用了X
。如果您观看 link 观看的视频,您会发现他之前曾向您展示过它是如何工作的。它实际上根据系统的ARGMAX
将"as many parameters as possible"传递给一个命令。所以,如果你想创建 10,000 个目录,而不是这样:
seq 1 10000 | parallel mkdir {}
这将启动 10,000 个单独的进程,每个 运行ning 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 个子目录。