Nextflow流程中检查文件夹存在性报错,如何正确处理?
问题描述
我正在编写Nextflow工作流,第一个流程需要创建文件夹来存储生成的文件,写的流程代码如下:
params.fast5 = "/scratch/use/fast5" params.refSeq = "/scratch/user/reference_sequences/NC_012920_OFFSET_2652.fa" params.guppy_out = "/scratch/user/GPU/output_8" process guppy { input: path fast5 path guppy_out path refSeq output: path "guppy.info" script: """ if [ -d "${guppy_out}" ] || test -f "${guppy_out}" then echo "Already exist" > debug.guppy else mkdir -p "${guppy_out}" fi job_id="\$(sbatch --parsable /scratch/user/scripts/guppy_script.sh $fast5 $guppy_out $refSeq)" echo "\${job_id}" > guppy.info """ }
运行时出现错误:
mkdir: cannot create directory 'output_8': File exists
但实际检查/scratch/user/GPU/output_8路径下并没有该名称的文件或文件夹。把${guppy_out}替换为具体路径后,又出现新错误:
boost::filesystem::create_directories: File exists [system:17]: "output_8", "output_8"
请问如何正确验证该文件/文件夹是否存在并按需创建?
解决方案
核心问题
你错误地将输出目录参数params.guppy_out声明为path类型的输入。Nextflow的path输入会自动将指定路径的文件/目录复制(stage)到流程的工作目录中,并且只保留路径的最后一段(也就是output_8)。这就导致你实际操作的是工作目录下的output_8,而不是你指定的/scratch/user/GPU/output_8,这才是报错的根源。
修正步骤
- 移除输入中的
path guppy_out:输出目录不需要作为输入处理,直接在脚本中使用params.guppy_out变量即可。 - 简化目录创建逻辑:
mkdir -p本身就会自动忽略已存在的目录,不需要额外的if判断,除非你需要记录日志。如果要保留判断,确保使用完整的参数路径。
修正后的代码
params.fast5 = "/scratch/use/fast5" params.refSeq = "/scratch/user/reference_sequences/NC_012920_OFFSET_2652.fa" params.guppy_out = "/scratch/user/GPU/output_8" process guppy { input: path fast5 path refSeq output: path "guppy.info" script: """ # 直接用完整参数路径,mkdir -p自动处理已存在的情况 mkdir -p "${params.guppy_out}" job_id="\$(sbatch --parsable /scratch/user/scripts/guppy_script.sh $fast5 ${params.guppy_out} $refSeq)" echo "\${job_id}" > guppy.info """ }
补充说明
如果确实需要检查目录是否存在并记录日志,修正后的判断逻辑应该是:
if [ -d "${params.guppy_out}" ]; then echo "目录已存在: ${params.guppy_out}" > debug.guppy elif [ -f "${params.guppy_out}" ]; then echo "路径已被文件占用: ${params.guppy_out}" > debug.guppy else mkdir -p "${params.guppy_out}" echo "已创建目录: ${params.guppy_out}" > debug.guppy fi
内容的提问来源于stack exchange,提问作者Antoine
相关产品推荐
相关产品推荐

