我使用make来编写用于生物数据分析的管道。我的项目目录是:
PROJECT
- DATA
- SAMPLEA
- A1.FASTQ A2.FASTQ
- SAMPLEB
- B1.FASTQ B2.FASTQ
- RESULTS
- SRC
- makefile
我当前的makefile使用通配符列出DATA目录中所有.FASTQ文件的目录。使用模式规则,每个.FASTQ文件都会经过一系列配方,最终输出文件写入RESULTS目录。相反,我想为每个SAMPLE创建一个目录,其中写入最终输出文件:
PROJECT/RESULTS/SAMPLEA/A1.out
PROJECT/RESULTS/SAMPLEA/A2.out
PROJECT/RESULTS/SAMPLEB/B1.out
PROJECT/RESULTS/SAMPLEB/B2.out
我可以通过让第一个配方创建目录来实现这一点,但是当来自同一个SAMPLE的第二个FASTQ文件也尝试创建目录时,这会引发错误。堆栈溢出上的一些帖子建议在mkdir上使用-p标志来忽略错误,但是当我使用-j标志并行运行makefile时,这显然会导致问题。我想在makefile的开头强制运行一个shell脚本,检查结果目录是否存在,如果不存在则应该创建它们,但是我想尝试使用make来解决这个问题
答案 0 :(得分:0)
在执行规则之前创建目录。
DATADIR := $(shell cd DATA; find * -type d)
create_results_dir:= $(shell for i in $(DATADIR); \
do test -d DATA/$$i && mkdir -p RESULTS/$$i; \
done)
all:
@echo do something.