GNU 并行参数

Das*_*ham 4 gnu-parallel

从例子

seq 1 100 | parallel -I @@ \ > 'mkdir top-@@;seq 1 100 | parallel -X mkdir top-@@/sub-{}
Run Code Online (Sandbox Code Playgroud)

怎么-X , @@, {}工作?此外,'1' 或 '.' 时的行为是什么?在 {} 内传递?/> 用于重定向吗?

我试图通过https://www.youtube.com/watch?v=P40akGWJ_gY&list=PL284C9FF2488BC6D1&index=2阅读教程并阅读 man 并行页面。我能够收集一些基本知识,但不知道如何使用它等。

Mar*_*ell 5

让我们先做简单的事情。

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

echo \
hi
Run Code Online (Sandbox Code Playgroud)

你会真正看到这个:

echo \
> hi
hi
Run Code Online (Sandbox Code Playgroud)

所以,我是说你可以忽略\>并只在一行上运行命令。


接下来,里面的东西{}。这些在GNU Parallel手册页中有描述,但本质上是:

  • {1} 指的是第一个参数
  • {2} 指的是第二个参数,依此类推

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

echo A B | parallel --colsep ' ' echo {2} {1}
B A
Run Code Online (Sandbox Code Playgroud)
  • {.} 指一个参数,通常是一个文件名,去掉其扩展名

测试这个:

echo fred.dat | parallel echo {.}
fred
Run Code Online (Sandbox Code Playgroud)

现在让我们来解决实际问题,如上所述删除了续行,并将所有内容放在一行中:

seq 1 100 | parallel -I @@ 'mkdir top-@@;seq 1 100 | parallel -X mkdir top-@@/sub-{}'
Run Code Online (Sandbox Code Playgroud)

所以,这基本上是在运行:

seq 1 100 | parallel -I @@ 'ANOTHER COMMAND'
Run Code Online (Sandbox Code Playgroud)

Ole在此命令中使用@@了代替,{}以便在第二个内部并行命令中使用的替换不会相互混淆。所以,在你看到的地方,@@你只需要用 first 中的值替换它seq 1 100

第二个并行命令与第一个几乎相同,但这里 Ole 使用了X. 如果您观看链接到的视频,您会看到他之前向您展示了它是如何工作的。它实际上是通过“尽可能多的参数可能”的命令,根据系统的ARGMAX。所以,如果你想创建 10,000 个目录,而不是这样:

seq 1 10000 | parallel mkdir {}
Run Code Online (Sandbox Code Playgroud)

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

seq 1 10000 | parallel -X mkdir
Run Code Online (Sandbox Code Playgroud)

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


现在让我们看一下外部parallel调用并进行试运行,看看它会做什么,实际上什么都不做:

seq 1 100 | parallel -k --dry-run -I @@ 'mkdir top-@@;seq 1 100 | parallel -X mkdir top-@@/sub-{}'
Run Code Online (Sandbox Code Playgroud)

输出

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-{}
Run Code Online (Sandbox Code Playgroud)

所以,现在您可以看到它将启动 100 个进程,每个进程将创建一个目录,然后启动 100 个进一步的进程,每个进程将创建 100 个子目录。