3

我有一个包含 10 个子目录(dir01 到 dir10)的目录和每个子目录中的许多文件(每天都会将新文件添加到子目录中)。

我正在尝试编写一个snakemake文件,该文件将遍历所有子目录和所有文件并处理它们(运行我的convert.exe可执行文件以将我的 .Stp 文件转换为 .Xml)。处理后的文件将被移动到一个新目录中,但会移动到与之前名称相同且文件名相同的子目录中。

所以 - 作为最后的一个例子,最终的工作流程应该类似于这样运行:

/data01/dir01/Sample1.Stp --> processed by convert.exe --> /data01/temp/dir01/Sample1.xml 

我还想将它分配给我可以访问的 12 个 CPU,并行运行。

我刚刚开始使用snakemake,并且已经完成了一些教程,但是我有点迷失了。

到目前为止,这是我所拥有的:它不起作用,我什至不确定这是否是解决它的写入方式。这也只是第一部分 - 只是尝试遍历目录和文件(还没有尝试转换或并行运行)。

directories = glob_wildcards("/data01/{dir}")
files = glob_wildcards("/data01/{dir}/{file}")

rule all:
        input:
                expand("/data01/temp/{dir}/{file}.moved.Stp", dir=directories, file=files)

rule sort:
        input:
                "/data01/{dir}/{file}.Stp"
        output:
                "/data01/temp/{dir}/{file}.moved.Stp"
        shell:
                "..."

任何有关如何解决此问题的帮助将不胜感激!

谢谢!

4

1 回答 1

4

根据这个FAQ entry,试试这个:

directories, files = glob_wildcards("data01/{dir}/{file}")

rule all:
    input:
        expand("data01/temp/{dir}/{file}.moved.Stp",
               zip, dir=directories, file=files)

rule copy:
    input:
        "data01/{dir}/{file}.Stp"
    output:
        "data01/temp/{dir}/{file}.moved.Stp"
    shell:
        "cp {input} {output}"

glob_wildcards的不工作。你需要

directories, = glob_wildcards("/data01/{dir}")

但是你真的需要一口气把所有东西都搞定,就像我的例子一样。expand将生成两个输入列表的所有 (N x N) 组合。如果每个目录中都有完全相同的文件,则可以使用该功能。但是,提供zip将两个列表逐个元素组合在一起。

于 2016-08-30T13:58:09.137 回答