2013-08-19 83 views
0

我正在嘗試製作一個腳本,該腳本允許我在對這些文件的特定列執行命令的同時逐行讀取目錄中的所有文件。我正在處理的文件是具有用逗號分隔的值的.txt文件。我可以通過將文本文件輸入到腳本,然後輸出值而不是多個文件來執行單個文件的代碼,這是我的目標。我希望文件按目錄中的順序讀取。這是我到目前爲止。在一個目錄中逐行讀取所有文件,並在它們上執行一條命令

directory=$(/dos2unix/*.txt) 
file=$(*.txt") 
IFS="," 
for "$file" in "$directory"; 
do 
    while read -ra line; 
    do 
      if [ "${line[1]}" != "" ]; then 
       echo -n "${line[*]}, Hash Value:"; echo "${line[1]}" | openssl dgst -sha1 | sed 's/^.* //' 
      else 
       if [ "${line[1]}" == "" ]; then 
        echo "${line[*]}, Hash Value:None"; 
       fi 
      fi 
    done 
done 

一些我收到的錯誤是:

$ ./orange2.sh 
/dos2unix/test1.txt: line 1: hello: command not found 
/dos2unix/test1.txt: line 2: goodbye: command not found 
/dos2unix/test1.txt: line 4: last: command not found 
./orange2.sh: line 28: unexpected EOF while looking for matching `"' 
./orange2.sh: line 33: syntax error: unexpected end of file 

任何提示,建議或例子嗎?

感謝所有

UPDATE

我也期待複製所有文件的最終包含您在第一次看到if語句,所以我想一個命令。)把我的文件分開和b。)創建一個包含更新值的副本。

+0

爲谷歌找到'型的F -execdir CMD {} \;' – hek2mgl

回答

0

如果要將文件名保存在變量中,請使用array=(a b c)語法來創建數組。沒有美元符號。然後用for item in "${array[@]}"循環訪問數組。

要從文件中讀取while read循環,請使用while read; do ...; done < "$file"。這看起來很奇怪,但是整個文件被重定向到循環中。

files=(/dos2unix/*.txt) 

for file in "${files[@]}"; do 
    while IFS=',' read -ra line; do 
     ... 
    done < "$file" 
done 

另一種方法是使用cat所有的文件選項串聯在一起,它可以讓你擺脫外for循環。

cat /dos2unix/*.txt | while IFS=',' read -ra line; do 
    ... 
done 
+0

我喜歡你在哪裏與第一例子去和它看起來像它應該工作,但是當我真正運行腳本,它需要我到下一行輸入文本,就好像我沒有要求輸入文件一樣。我不想對文件進行轉換,因爲我們希望將文件的副本保留爲所有文件的分隔。任何想法爲什麼它不讀取文件並要求文本? – Beardy

+0

@Beardy'cat'不會修改這些文件,它只是將它們依次打印到標準輸出。 –

+0

對,但如果我想要將file1.txt等文件複製到file1-copy.txt,那麼我可能不想使用cat。我想從根本上讀取所有文件,但只能一個一個讀取,將它的內容與我將在特定列上運行的更新命令一起復制。該副本將包含更新。那有意義嗎? – Beardy

相關問題