我有一个包含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:
"..."
非常感谢任何关于如何解决这个问题的帮助!
谢谢!
答案 0 :(得分:2)
您检查了这个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
会逐个元素地组合两个列表。