簡體   English   中英

循環遍歷目錄一層,並在該目錄中以 bash 中的目錄名稱作為參數執行腳本

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

我有一個批處理腳本,我想用它在特定級別的所有目錄上運行。 它調用一個腳本( recon1.sh ),該腳本將目錄名稱作為參數並將結果文件夾存儲在每個子目錄中。 我想要的是,當從命令行bash batch_recon1.sh 路徑_X )指定路徑名稱時,它cd進入每個蛋白質文件夾(蛋白質_A,蛋白質_B,...。蛋白質_Z)並執行 recon1.sh 並對所有蛋白質執行此操作路徑文件夾。 目前,它在一種蛋白質(蛋白質_A)沒有為蛋白質_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 作為 arg(例如 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由於任何原因仍然失敗,則會打印錯誤,但腳本不會退出,並嘗試下一個蛋白質。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM