在目录上循环一层,并在该目录中的 bash 中以目录名称作为参数执行脚本

Loop over directories one level deep and execute script with directory name as argument in bash in that directory

我有一个批处理脚本,我想将其用于 运行 特定级别的所有目录。它调用一个脚本(recon1.sh),该脚本将目录名作为参数并将结果文件夹存储在每个子目录中。 我想要的是,当从命令行指定 pathway_name 时(bash batch_recon1.sh pathway_X), 它cd到每个蛋白质文件夹(protein_A,protein_B, ....protein_Z) 并执行 recon1.sh 并对通路文件夹下的所有蛋白质执行此操作。目前,它在一个蛋白质(protein_A)没有开始为 protein_B 等。我怎样才能解决这个问题?我尝试使用更简单的脚本,该脚本仅在子文件夹上循环一层,并将该目录中的 file_names 写入文本文件,效果非常好,但出于某种原因,此代码(batch_recon1.sh for recon1.sh) 不工作。有人可以帮忙吗?

文件夹结构:

[软件文件夹]

${HOME}/ProjName/software/batch_recon1.sh

${HOME}/ProjName/software/recon1.sh

[项目文件夹]

${HOME}/ProjName/pathways/Pathway_X/protein_A/

${HOME}/ProjName/pathways/Pathway_X/protein_A/protein_A_id
${HOME}/ProjName/pathways/Pathway_X/protein_A/protein_A_searchRes
${HOME}/ProjName/pathways/Pathway_X/protein_A/protein_A_alignment

${HOME}/ProjName/pathways/Pathway_X/protein_B/

${HOME}/ProjName/pathways/Pathway_X/protein_B/protein_B_id
${HOME}/ProjName/pathways/Pathway_X/protein_B/protein_B_searchRes
${HOME}/ProjName/pathways/Pathway_X/protein_B/protein_B_alignment

recon1.sh 将 protein_name 作为参数 (例如 recon1.sh protein_A)

所以 ${dirname} 应该是(即)“protein_A”而不是蛋白质文件夹的完整路径。

用作(从命令行)bash batch_recon1.sh Pathway_X

batch_recon1.sh的代码:

    #!/bin/bash
    # -*- coding: utf-8 -*-
        
    set -e
    current_path=$(pwd)
    
    pathway_name=
    path_to_folder=${HOME}/ProjName/pathways/${pathway_name}
    path_to_software_folder=${HOME}/ProjName/software

    cd ${path_to_folder}
    echo '----running batch_reconcile1.sh on pathway:'$@
        
        


    for fol in "${path_to_folder}"/*/; do
      [ -d "${fol}" ] || continue ## if not a directory skip
      dirname="$(basename "${fol}")"
      (cd "${fol}" && bash ${path_to_software_folder}/recon1.sh ${dirname} )
      cd ..
    done

脚本可能提前退出,因为 recon1.sh 失败,并且您有 set -e(如果命令失败则退出)。

可能是由于 cd .. 不应该出现而失败。

所有 蛋白质上继续尝试 recon1.sh 可能会更好,即使其中一个失败(这取决于您)。

替换

(cd "${fol}" && bash ${path_to_software_folder}/recon1.sh ${dirname} )
cd ..

有:

cd "${fol}" || continue
bash ${path_to_software_folder}/recon1.sh "${dirname}" || echo "recon1.sh failed for ${dirname}" >&2

工作目录设置正确。如果 recon1.sh 由于任何原因仍然失败,则会打印错误,但脚本不会退出,并尝试下一个蛋白质。