如何将Nextflow多进程输出统一保存到publishDir单个文件夹
Nextflow 统一输出到单个publishDir文件夹的实现示例
针对你的需求,以下是两种实用的实现方式,核心是让所有分散的输出文件最终归集到nf_output下的单个目录中:
方法一:直接在处理进程中配置统一发布路径
修改searchlibrarysearch_molecularv2_parallelstep1进程的输出和publishDir配置,让每个进程生成的结果文件直接复制到目标统一目录,避免创建子文件夹:
process create_parallel_params { output: path 'parallel_params', emit: parallel_params script: """ # 模拟生成含JSON文件的parallel_params文件夹 mkdir -p parallel_params echo '{"sample": "A"}' > parallel_params/sample_A.json echo '{"sample": "B"}' > parallel_params/sample_B.json """ } process searchlibrarysearch_molecularv2_parallelstep1 { # 配置统一的发布目录,mode设为copy确保文件复制而非硬链接 publishDir 'nf_output/consolidated_results', mode: 'copy', overwrite: true input: path json_file from create_parallel_params.out.parallel_params.list() # 输出文件夹内的所有文件,而非整个文件夹本身 output: path 'result_folder/*', emit: result_files script: """ # 模拟处理JSON文件生成结果文件 mkdir -p result_folder # 用JSON文件名前缀确保输出文件唯一,避免重名覆盖 echo "Processed sample: ${json_file.baseName}" > result_folder/${json_file.baseName}_log.txt echo "analysis_result,123" > result_folder/${json_file.baseName}_data.csv """ } workflow { create_parallel_params() }
关键说明
- 输出指定
result_folder/*,Nextflow会将文件夹内的所有文件单独发布到publishDir,不会创建子目录 mode: 'copy'保证文件被复制到目标目录,避免硬链接带来的路径问题- 给输出文件添加唯一前缀(如JSON文件名),防止不同进程的重名文件互相覆盖
方法二:新增收集进程汇总所有结果
如果需要先保留每个进程的结果文件夹结构,再统一归集,可以添加一个专门的收集进程:
process create_parallel_params { output: path 'parallel_params', emit: parallel_params script: """ mkdir -p parallel_params echo '{"sample": "X"}' > parallel_params/sample_X.json echo '{"sample": "Y"}' > parallel_params/sample_Y.json """ } process searchlibrarysearch_molecularv2_parallelstep1 { input: path json_file from create_parallel_params.out.parallel_params.list() output: path 'result_folder', emit: result_folders script: """ mkdir -p result_folder echo "Processed ${json_file.baseName}" > result_folder/log.txt echo "value,456" > result_folder/data.csv """ } process collect_all_results { publishDir 'nf_output/all_results', mode: 'copy' input: path result_folders from searchlibrarysearch_molecularv2_parallelstep1.out.result_folders.collect() output: path 'consolidated/*' script: """ mkdir -p consolidated # 将所有结果文件夹内的文件复制到统一目录,可根据需求调整复制逻辑 for folder in ${result_folders}; do cp -r \${folder}/* consolidated/ done """ } workflow { def params = create_parallel_params() def step1_results = searchlibrarysearch_molecularv2_parallelstep1(params.out.parallel_params.list()) collect_all_results(step1_results.out.result_folders) }
关键说明
- 用
collect()方法收集所有result_folders到收集进程 - 在收集进程中通过脚本将所有分散的结果文件复制到统一目录,可灵活调整文件组织方式
内容的提问来源于stack exchange,提问作者sudojarvis
相关产品推荐
相关产品推荐

