>我有一个批处理脚本,我想用它来在特定级别的所有目录上运行。它调用一个 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
由于任何原因仍然失败,则会打印错误,但脚本不会退出,并尝试下一个蛋白质。