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