使用snakemake处理多个文件夹和文件夹内的所有文件

4
我有一个包含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:
                "..."

任何关于如何进行此操作的帮助将不胜感激!谢谢!
1个回答

5

根据这个常见问题解答,尝试以下操作:

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 按元素逐个组合这两个列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接