循环访问一级深度的目录,并在该目录中的 bash 中执行具有目录名称作为参数的脚本



>我有一个批处理脚本,我想用它来在特定级别的所有目录上运行。它调用一个 script(recon1.sh),该脚本将目录名称作为参数并将结果文件夹存储在每个子目录中。 我想要的是,当从命令行(bash batch_recon1.sh pathway_X)指定pathway_name时,它会cd到每个蛋白质文件夹(protein_A,protein_B,....protein_Z)并执行 recon1.sh 并对通路文件夹下的所有蛋白质执行此操作。目前,它在一种蛋白质(protein_A)没有开始protein_B和其他蛋白质后结束。我该如何解决这个问题?我尝试使用更简单的脚本,该脚本仅循环一个级别的子文件夹并将该目录中的file_names写入文本文件,这工作得很好,但由于某种原因,此代码(batch_recon1.sh用于 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=$1
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由于任何原因仍然失败,则会打印错误,但脚本不会退出,并尝试下一个蛋白质。

最新更新