Homebrew 有一个公式moreutils和GNUparallel。
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)
有什么办法可以两全其美?
我有一个目录.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)
我究竟做错了什么?
谢谢
我正在使用 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) 我正在尝试将许多巨大的 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.gz,big_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 并行中按预期工作?
我有这个脚本:
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从并行可见?
我对如何使用 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) 如何stdin立即为每一行执行命令?
示例:
(echo abc; sleep 10; echo def;) | ???
Run Code Online (Sandbox Code Playgroud)
该xargs工具不会完成这项工作,因为它会阻塞直到看到所有数据(等待 stdout 关闭)。然而,当新行可用时,我必须立即执行命令。
我的理解是 -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 是一个功能强大的工具,我用它来并行运行许多独立的 BASH 命令作为一组。我希望能够顺序运行相同的命令,而不会对我使用的命令进行重大更改。我知道有一个开关可以强制按顺序运行输出,但我希望 gnuparallel 实际上按顺序运行。我的原因是为了在一台容易过热的机器上进行测试,解决我的硬件问题不是一种选择,此外,人们可能会想象其他测试方案,顺序运行 gnuparallel 会很有用。
所以。有没有办法简单地按顺序运行 gnuparallel 或者我需要手动将 gnuparallel 命令集解压到其组件命令中并按顺序运行它们?
我目前正在并行测试 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