2013-01-13 61 views
1

我有一個文件'list',其中包含我想解壓縮的存檔列表。我的腳本是:bash逐行讀取文件並使用行作爲參數

#!/bin/bash 
while read line 
do 
    echo 'string has been read' 
    grep -e '**.zip' | xargs -d '\n' unzip -o 
done < 'list' 

但它只適用於列表中的第一個zip存檔並忽略列表中的其他字符串。如果我註釋掉'grep -e '**.zip' | xargs -d '\n' unzip -o'腳本,則會讀取所有行。

我不明白爲什麼它這樣工作,以及如何解決它。

+0

至於什麼實際發生這裏'grep'命令將消耗剩下的來自'list'的行。您不告訴它從何處讀取,因此它正在讀取標準輸入,該輸入被重定向爲來自您的文件。當然,'grep -e'**。zip''將文件中的匹配除第一個之外的文件傳遞給'xargs',所以它實際上並沒有按照你認爲的那樣做。 (還要注意的是,正則表達式是無效的;它可能不會返回任何匹配或所有行,或者與匹配正則表達式的有效部分的行) – tripleee

回答

1

你並沒有在你的循環中引用$line。因此它不會按照你想要的方式工作。

什麼:

#!/bin/bash 
while read line; do 
    if [[ "$line" =~ "\.zip$" ]]; then 
     unzip -o $line 
    fi 
done < list 
+0

謝謝,它可以工作。但列表包含7z和tar檔案,所以我想只解壓zip檔案。 –

+0

檢查更新後 – jgr

+0

謝謝!這正是我需要的! –

3

可能是,即使沒有一個循環做的,我想。

grep '\.zip$' < yourfile.txt | xargs -n1 unzip -o 

,或者從標準輸入:

grep '\.zip$' | xargs -n1 unzip -o 

的-N1告訴xargs的使用1個命令行參數每

+0

謝謝!這也是一個非常好的解決方案。 –