2012-06-28 29 views
2

我寫了一個小bash *腳本來處理目錄中的文件。這些文件具有特定的命名約定,它決定了文件的處理方式。bash腳本無法按預期匹配文件

文件名以地理原點開頭,然後在文件名中包含一個關鍵字,決定應如何處理。

這裏是我的腳本的精簡版:

DATA_DIRECTORY=./data 

array=('uk' 'usa' 'fra' 'ukr') 

for i in "${array[@]}" 
do 
    echo "#################################################" 
    echo "Loop index : $i" 
    echo "#################################################" 

    # process baboon data for the current country 
    for filename in $DATA_DIRECTORY/$i_*_baboon*.csv; do 
     echo "Processing file: $filename in loop: $i" 
    done 

    # process whale data for the current country 
    for filename in $DATA_DIRECTORY/$i_*_whale*.csv; do 
     echo "Processing file: $filename in loop: $i" 
    done 

    # process lion data for the current country 
    for filename in $DATA_DIRECTORY/$i_*_lion*.csv; do 
     echo "Processing file: $filename in loop: $i" 
    done 

done 

我期待上面的腳本文件通過以下方式匹配:一個名爲us_2007_deaths_caused_by_baboon.csv將一次處理的文件 - 當循環計數器變量是'我們',並在循環for filename in $DATA_DIRECTORY/$i_*_baboon*.csv;。然而,匹配沒有按照我的預期工作,並且每個(嵌套for循環)循環遍歷目錄中的所有文件 - 這就是我想要的NOT

如何根據文件名模式匹配文件?

*注:我使用的是bash 4.1.5版本在Ubuntu 10.0.4

+0

這樣做的方式不一樣嗎?它搜索的方式將一次遍歷整個列表,刪除可以讓所有的數組[0]文件。然後所有的數組[1]等。如果你有100個文件,並且每個數組[0-3]都是一個確切的四分之一(其中每個25個)。它會搜索100x 75x 50x 25x。 250次比較。如果你檢查它們(file1 = array [0-3]),你將有400-25-50-75 = 250比較。我有沒有把事情搞砸了,現在已經很晚了,如果我做了,我很抱歉。 – Sturm

回答

6

${i}_而不是$i_因爲$i_是 「」(慶典認爲i_是這裏的變量)。

例如:使用${i}

for filename in $DATA_DIRECTORY/${i}_*_baboon*.csv; do 
    echo "Processing file: $filename in loop: $i" 
done 
+0

我難以置信地搖着頭我有一天浪費了這個嗎?!無論如何感謝 - 問題解決了! –

+0

+1,行情會更好。儘管對這些已知值有效。 – ormaaj

0

嘗試代替$i因爲$i_*將被解析爲變量i_代替i