为了账号安全,请及时绑定邮箱和手机立即绑定

删除文件的蛇形规则

删除文件的蛇形规则

一只萌萌小番薯 2021-06-27 15:52:25
我有一个看起来像这样的大蛇形文件(在简化了很多之后)。rule a:    input: '{path}.csv'    output: '{path}.a.csv'    shell: 'cp {input} {output}'rule b:    input: '{path}.csv'    output: '{path}.b.csv'    shell: 'cp {input} {output}'rule c:    input: '{path}.csv'    output: '{path}.c.csv'    shell: 'cp {input} {output}'rule d:    input: '{path}.csv'    output: '{path}.d.csv'    shell: 'cp {input} {output}'rule all:    input: 'raw1.a.b.c.a.d.csv',           'raw2.a.b.c.d.a.csv'(这个设置让我可以使用像函数这样的规则,通过在all规则中链接它们的文件名后缀。)开始状态:$ ls -tr1Snakefileraw1.csvraw2.csv$ snakemake all...后:$ ls -tr1Snakefileraw1.csvraw2.csvraw2.a.csvraw2.a.b.csvraw2.a.b.c.csvraw2.a.b.c.d.csvraw1.a.csvraw1.a.b.csvraw1.a.b.c.csvraw1.a.b.c.a.csvraw1.a.b.c.a.d.csvraw2.a.b.c.d.a.csv现在,我想添加一个规则来删除特定的中间文件(例如raw1.a.csv和raw2.a.b.csv),因为我不需要它们并且它们占用大量磁盘空间。temp()由于通配符,我无法标记输出{path}。有小费吗?谢谢。
查看完整描述

2 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

temp() 在这种情况下确实有效。


rule all:

    input: 'raw1.a.b.c.a.d.csv',

        'raw2.a.b.c.d.a.csv'


rule a:

    input: '{path}.csv'

    output: temp('{path}.a.csv')

    shell: 'cp {input} {output}'

rule b:

    input: '{path}.csv'

    output: '{path}.b.csv'

    shell: 'cp {input} {output}'

rule c:

    input: '{path}.csv'

    output: temp('{path}.c.csv')

    shell: 'cp {input} {output}'

rule d:

    input: '{path}.csv'

    output: '{path}.d.csv'

    shell: 'cp {input} {output}'

执行此操作将导致创建文件raw1.a.b.c.a.d.csv , raw1.a.b.csv, raw2.a.b.c.d.csv, raw2.a.b.csv和自动删除文件raw1.a.csv, raw2.a.csv, raw1.a.b.c.csv, raw2.a.b.c.csv, raw1.a.b.c.a.csv, raw2.a.b.c.d.a.csv。


查看完整回答
反对 回复 2021-07-06
?
BIG阳

TA贡献1859条经验 获得超6个赞

编辑:实际上,这个解决方案不起作用..它会导致竞争条件......


好吧,我想通了...


rule a:

    input: '{path}.csv'

    output: '{path}.a.csv'

    shell: 'cp {input} {output}'

rule b:

    input: '{path}.csv'

    output: '{path}.b.csv'

    shell: 'cp {input} {output}'

rule c:

    input: '{path}.csv'

    output: '{path}.c.csv'

    shell: 'cp {input} {output}'

rule d:

    input: '{path}.csv'

    output: '{path}.d.csv'

    shell: 'cp {input} {output}'

rule remove:                          # <-- rule to delete a file

    input: '{path}'

    output: touch('{path}.removed')

    shell: 'rm {input}'

rule all:

    input: 'raw1.a.b.c.a.d.csv',

           'raw2.a.b.c.d.a.csv',

           'raw1.a.csv.removed',      # <-- specify which files to rm

           'raw2.a.b.c.csv.removed',  # <-- specify which files to rm

这是dag:


$ snakemake --dag all | dot -Tpng > dag.png

//img1.sycdn.imooc.com//60e40a0800018dff06140538.jpg

查看完整回答
反对 回复 2021-07-06
  • 2 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信