2011-04-06 62 views
0

我是bash的新手,並且難以處理目錄樹結構。 我有如下按目錄分支對文件進行分組/葉

I/A/dataA.dat 
I/B/dataB.dat 
I/C/dataC.dat 

II/A/dataA.dat 
II/B/dataB.dat 
II/C/dataC.dat 

III/A/dataA.dat 
III/B/dataB.dat 
III/C/dataC.dat 

我現在要處理I/A/dataA.datI/B/dataB.datII/B/dataB.dat等(對每一種情況)同樣II/A/dataA.dat的目錄結構。但我不想處理,例如,I/A/dataA.datII/B/dataB.dat

找到這樣的文件對的最佳方法是什麼?

我希望找到對的名稱傳遞到慶典等功能如下

function process_pair() 
{ 
    fileOne=$1; #for example II/A/data.dat 
    fileTwo=$2; #for example II/B/data.dat 
    //the rest of the function that processes this pair. 
} 

,但我不知道怎麼弄的變量$1$2

我目前使用bash並從dirs=find $SOURCE -type d -links 2命令開始(查找所有葉目錄 - adapted from this question)。然後我試圖循環這些(使用子字符串命令來獲取上面的目錄)。 但是,我發現這很困難,我認爲必須有更好的方法。

+0

這是朝着諸如此類的事情,邊你可能更喜歡一個更全面的腳本語言。顯而易見的方法是構建一個數據結構,對於每個文件名,它包含它出現的目錄列表,這樣每次讀取目錄時,都會在每個目錄中處理每個文件中的每個文件在相應的列表中。例如,這在perl中非常容易,並且有數組散列。 – Cascabel 2011-04-06 14:05:12

+0

謝謝@Jefromi,如果我在這裏沒有收到更多回復,我會挖掘出我的Perl書籍(無論如何,它都需要粉塵......) – Tom 2011-04-06 14:11:01

回答

1

在殼隨手做:

for dir in I II III; do 
    subdirs=() 
    for subdir in $dir/*; do subdirs+=("${subdir##*/}"); done 
    for ((i=0 ;i<${#subdirs[*]}-1; i++)); do 
     for ((j=i ;j<${#subdirs[*]} ;j++)); do 
      a=${subdirs[$i]} 
      b=${subdirs[$j]} 
      process_pair $dir/$a/data$a.dat $dir/$b/data$b.dat 
     done 
    done 
done 
相關問題