标签: gnu-parallel

如何安装 GNU Parallel 和 Moreutils?

Homebrew 有一个公式moreutilsGNUparallel

GNU Parallel 与 Moreutils 发生冲突,因为它还有一个名为 的二进制文件parallel,它的用处不大。但是我仍然想同时安装两个公式。我怎样才能做到这一点?

理想情况下,我将 GNU Parallel 安装为gparallel- 类似于 Coreutils 二进制文件的命名 - 以避免这些冲突,但我没有看到在公式本身中指定它的方法,因为prefix它只是 Homebrew 前缀。

def install                                                                                                                               
    system "./configure", "--prefix=#{prefix}"                                                                                              
    system "make install"                                                                                                                   
end
Run Code Online (Sandbox Code Playgroud)

有什么办法可以两全其美?

homebrew gnu-parallel macos

9
推荐指数
2
解决办法
3622
查看次数

如何将 GNU 与 gunzip 并行使用

我有一个目录.gz,我想与 GNU 并行并行扩展每个存档。但是我没有取得任何成就。

我试过

parallel 'gunzip {}' ::: `ls *.gz`
parallel gunzip `ls *.gz`
Run Code Online (Sandbox Code Playgroud)

没有结果,bash 告诉我:

/bin/bash: archive1.gz: command not found
...
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

谢谢

bash ls gunzip gnu-parallel

9
推荐指数
1
解决办法
1万
查看次数

在 GNU Parallel 中抑制 stderr

我正在使用 GNU Parallel 同时运行命令数千次。

为了获取我正在使用的执行日志--files--results.

为了在运行时获得漂亮的进度条,我正在使用--eta--progress

现在,我的问题是,虽然 STDERR 被重定向到文件,但它仍然打印到终端,这会损坏我的进度条。

如何禁止将 STDERR 打印到终端?我仍然希望在日志文件中包含这些信息,所以我不能只将命令包装到2>/dev/null.

到目前为止,我的命令行如下所示:

cat input.txt | parallel -P 10 --progress --eta --files --results output_dir/ "./script.sh some-arg {}"
Run Code Online (Sandbox Code Playgroud)

stderr ubuntu gnu-parallel

5
推荐指数
1
解决办法
3184
查看次数

如何将 GNU split 的“过滤器”选项与 GNU 并行一起使用?

我正在尝试将许多巨大的 gz 文件分割成 N 行压缩的 gzip 块。

为了演示,让我们考虑以下内容:

seq 100 | gzip > big_file0.gz
Run Code Online (Sandbox Code Playgroud)

我可以将其分成多个 10 行压缩文件,如下所示:

zcat big_file0.gz | split -l 10 --filter='gzip > $FILE.gz' - big_file0.
Run Code Online (Sandbox Code Playgroud)

让我们假设我们有许多大文件big_file0.gzbig_file1.gz...

我现在想使用 GNU 并行分割这些文件中的每一个。这是我想出的命令:

parallel "zcat {} | split -l 10 --filter='gzip > $FILE.gz' - {.}." ::: big_file0.gz big_file1.gz
Run Code Online (Sandbox Code Playgroud)

但是,外壳替换 并$FILE没有按预期工作。$FILE被替换为空字符串,因此所有输出都写入名为.gz.

如何让$FILE替换在 GNU 并行中按预期工作?

shell gnu-parallel

4
推荐指数
1
解决办法
4782
查看次数

GNU Parallel - 全局变量和函数

我有这个脚本:

GLOBAL_VAR="some global value"

function test
{
  echo $1
  echo ${GLOBAL_VAR}
}

export -f test  
parallel --jobs 5 --linebuffer test ::: "${files[@]}"
Run Code Online (Sandbox Code Playgroud)

我怎样才能$GLOBAL_VAR从并行可见?

linux sh gnu-parallel

4
推荐指数
1
解决办法
1776
查看次数

GNU“parallel --pipe”不按行处理标准输入

我对如何使用 GNU 并行将 stdin 传递给作业命令感到非常困惑。

我有一个我认为非常常见的用例。我有一些进程xxd使用标准输入执行某些操作并输出到标准输出。例如,我有某种方法可以从另一个标准流生成或获取工作,seq 3并且我可以将两者结合起来并制作一个临时的电动工具,如下所示:

$ seq 3 | while read line; do echo $line | xxd; done
00000000: 310a                                     1.
00000000: 320a                                     2.
00000000: 330a                                     3.
Run Code Online (Sandbox Code Playgroud)

伟大的。我们可以清楚地看到,每次调用都会xxd获取一行,并附加一个尾随换行符。

这就是管道的作用parallel

$ seq 3 | parallel --pipe --recend="\n" -L 1 xxd
...

00000000: 310a 320a 330a                           1.2.3.
Run Code Online (Sandbox Code Playgroud)

parallel --pipe获取所有标准输入并将其发送到一个调用,xxd这让我感到困惑,因为所有记录的参数及其默认值似乎与此行为相矛盾:(--recend="\n"默认值)通过换行符分隔作业,-L 1(默认值)最多向命令发送一行。

空分隔符也有同样的问题。它们也被逐字传递:

seq 3 | tr '\n' '\0' | parallel --null --pipe xxd
... …
Run Code Online (Sandbox Code Playgroud)

pipe gnu-parallel

4
推荐指数
1
解决办法
4094
查看次数

立即为每一行标准输入执行一个命令?

如何stdin立即为每一行执行命令?

示例

(echo abc; sleep 10; echo def;) | ???
Run Code Online (Sandbox Code Playgroud)

xargs工具不会完成这项工作,因为它会阻塞直到看到所有数据(等待 stdout 关闭)。然而,当新行可用时,我必须立即执行命令。

linux bash command-line xargs gnu-parallel

3
推荐指数
1
解决办法
1777
查看次数

GNU 并行并没有平均分配工作

我的理解是 -X 选项应该在作业之间均匀分配参数。然而,我得到了一个非常倾斜的分布:

user@host:/tmp/ptest$ count() {
>   echo $#
> }
user@host:/tmp/ptest$ export -f count

user@host:/tmp/ptest$ count *.jpg
5825
user@host:/tmp/ptest$ parallel -X count ::: *.jpg
5039
197
197
197
195
Run Code Online (Sandbox Code Playgroud)

有趣的是,仅使用文件的子集会导致参数均匀分布:

user@host:/tmp/ptest$ count p129*.jpg
975
user@host:/tmp/ptest$ parallel -X count ::: p129*.jpg
244
244
244
243

user@host:/tmp/ptest$ count p12*.jpg
4007
user@host:/tmp/ptest$ parallel -X count ::: p12*.jpg
1002
1002
1002
1001

user@host:/tmp/ptest$ count p13*.jpg
1818
user@host:/tmp/ptest$ parallel -X count ::: p13*.jpg
455
455
455
453
Run Code Online (Sandbox Code Playgroud)

为什么第一种情况是错误的,我该如何修复它?

gnu-parallel

3
推荐指数
1
解决办法
325
查看次数

如何强制 gnuparallel 按顺序执行命令集?

Gnu Parallel 是一个功能强大的工具,我用它来并行运行许多独立的 BASH 命令作为一组。我希望能够顺序运行相同的命令,而不会对我使用的命令进行重大更改。我知道有一个开关可以强制按顺序运行输出,但我希望 gnuparallel 实际上按顺序运行。我的原因是为了在一台容易过热的机器上进行测试,解决我的硬件问题不是一种选择,此外,人们可能会想象其他测试方案,顺序运行 gnuparallel 会很有用。

所以。有没有办法简单地按顺序运行 gnuparallel 或者我需要手动将 gnuparallel 命令集解压到其组件命令中并按顺序运行它们?

linux bash parallel-processing gnu-parallel

2
推荐指数
1
解决办法
1171
查看次数

gnu 并行删除命令中空格字符前的转义

我目前正在并行测试 gnu 以使用 bash 在多个服务器之间分发比较命令。在其最基本的功能中,此比较命令需要两个输入进行比较(oracle 数据库访问),并需要通过 -o 输出文件名。程序至少需要一个动作加载、保存或直接上传。

compare -o cmp.input1.input2.dat Input1 Input2
Run Code Online (Sandbox Code Playgroud)

我有几千个这样的输入对并创建一个包含所有组合的文件,以便每一行都包含程序所需的输出文件名和数据库标识符

#test_parallel
-o cmp.input1.input2.dat Input1 Input2
-o cmp.input1.input3.dat Input1 Input3
-o cmp.input2.input3.dat Input2 Input3
[...]
Run Code Online (Sandbox Code Playgroud)

并使用并行执行命令,但是比较命令失败

parallel -a test_parallel "compare {}"
ERROR: No action specified for results (load, save or direct upload)
usage: compare [-u][-o <file>] query target
Run Code Online (Sandbox Code Playgroud)

使用--dryrun模式这是并行执行的:

compare -o\ cmp.input1.input2.dat\ Input1\ Input2
Run Code Online (Sandbox Code Playgroud)

由于某种原因,我不明白,比较程序没有正确处理转义的空格。在 bash 中执行此命令会导致完全相同的错误消息消息。在 -o 标志之后删除转义符(我可以将 -o 移动到并行命令)会导致“参数过多”错误。删除所有转义符会按预期执行命令。

是否可以告诉 parallel 在命令调用中不打印转义符?我似乎没有在文档中找到任何内容,除了这是预期的默认行为,如parallel --shellquote

bash command-line gnu-parallel

2
推荐指数
1
解决办法
1450
查看次数