Shell-Script
Bash 循環遍歷兩組文件
我正在嘗試編寫一個可以遍歷兩個文件夾並將文件執行到 python 程序中的 bash 腳本。python 程序接受兩個輸入文件(每個文件夾中的相應文件)並輸出一個文件。
它看起來有點像這樣:
folder 1/ Run_1.out Run_2.out Run_3.out ... folder 2/ Sym_1.g0.out Sym_2.g0.out Sym_3.g0.out ...
python 程序接受相應的輸入(例如
Run_1.out
和Sym_1.g0.out
)並輸出一個文件,如下所示:NOCI.py Run_1.out Sym_1.g0.out outputfile
當通過終端使用一對文件時,python 程序執行良好,但由於我有 360 對文件,我認為我應該使用腳本。到目前為止,我已經嘗試編寫兩個 for 循環,但它似乎不起作用:
#!/bin/bash FILE1=*.out FILE2=*.g0.out for i in $FILE1 do for j in $FILE2 do NOCI.py $i $j ${i}_${outputfile} done done
匹配360
folder 1/Run_1.out
對folder 2/Sym_1.g0.out
,依此類推:for n in {1..360} do NOCI.py "folder 1/Run_$n.out" "folder 2/Sym_$n.g0.out" outputfile done
或者,如果配對的文件不是按順序排列的,您可以選擇
Run_N.out
文件並關聯相應的Sym_N.g0.out
文件:for r in "folder 1/Run_"*.out do n="${r#folder 1/Run_}"; n="${n%.out}" s="folder 2/Sym_$n.out" NOCI.py "$r" "$s" outputfile done
zsh
會比bash
這種任務更適合:#! /bin/zsh - files1=(1/*.out(n)) files2=(2/*.go.out(n)) for f1 f2 (${files1:^files2}) NOCI.py $f1 $f2 3/$f1:t:r+$f2:t
(n)
以數字方式對 glob 進行排序,以便按數字順序處理它們(在哪裡Run_10
出現,Run_9
而Run_11
不是在Run_1
和Run_2
沒有它之間)。${array1:^array2}
: 壓縮兩個數組$file:t
: 文件的尾部(基本名稱)$filr:r
:根部分(刪除副檔名)。所以我們最終執行:
NOCI.py 1/Run_1.out 2/Sym_1.g0.out 3/Run_1+Sym_1.g0.out NOCI.py 1/Run_2.out 2/Sym_2.g0.out 3/Run_2+Sym_2.g0.out ...