GNU parallel stderr with --files or sensible --results tree

GNU parallel stderr with --files or sensible --results tree

我最近发现了 GNU parallel,它已经非常有用了,但我不知道如何将我的所有输出放入任何类型的可用结构中。这是我的问题:

所以:有没有什么办法 并行,即不必修改我的命令 来在使用 --files 或强制 --results 时获取 stderr 以使用合理的目录名字?

编辑: 为了回应评论,我试过:

find controlFiles/ -name "*.txt" | parallel --files --tmpdir logs --tagstr {/.} -j15 --joblog logs/joblog --eta /path/to/command --opt --opt2 /path/to/data /path/to/output {} > logs/logfiles.txt

find controlFiles/ -name "*.txt" | parallel --files --results logs --tagstr {/.} -j15 --joblog logs/joblog --eta /path/to/command --opt --opt2 /path/to/data /path/to/output {} > logs/logfiles.txt

其中前者丢失 stderr 而后者产生不可用的目录名

编辑2: 经过更多测试后,我似乎以某种方式让事情进入了 really 奇怪的状态。 --results 中的目录结构应该以参数命名,但不知何故我使用了整个命令。当我尝试删除现有的日志目录并使用我认为是相同的命令重新开始时,我得到了预期的行为。仍然不理想,但我当然可以忍受。

最明显的解决方案是在作业完成后重命名目录的长部分。

cd resultdir/1/
rename 's:long/common/string/to/remove::' */2/*

另一个想法是使用新的 .csv 输出(从 20161222 开始可用):

parallel --results foo.csv ...

这将生成一个 CSV 文件,其中包含来自 --joblog 的内容、参数、标准输出和标准错误。如果您想 post 在 R 或 LibreCalc 中处理它,这将特别方便。

如果您喜欢混合 stderr/stdout,只需让 2>&1 成为您的命令的一部分:

parallel '(echo joe; ls /doesnotexists {}) 2>&1' ::: bar > foo

从版本 20170122 开始,您可以:

parallel --results out/{/.} mycommand