2014-04-30 74 views
2

我有5個zip文件,其中每個文件都是幾個.txt文件和其他一些文件。我只想解壓縮那些擴展名爲.txt的文件,但是在循環的第一個迭代中,unzip正確運行時將「* .txt」視爲常量字符串,並且在所有後續迭代中unzip嘗試使用完全相同的文件名解壓縮文件(即那些在前面的zip文件中的文件)。bash - 從多個zip解壓縮特定類型的文件

for file in *.zip 
do 
    unzip ${file} *.txt 
done 

作爲一個例子,在第一回路花費1.zip和例如解壓file1.txt然後進入第二個循環,它需要2.zip並嘗試再次提取file1.txt - 而不是從2.zip中選擇所有.txt文件。

+0

什麼不工作有關你給過的例子? – jwg

+0

在第一個循環中需要1.zip和解壓縮,例如file1.txt然後進入第二個循環,它需要2.zip並嘗試解壓縮file1.txt - 而不是從2.zip中獲取.txt文件。 – herder

+0

你是說第二個和後來的zip文件中的txt文件與第一個文件具有相同的名稱,並覆蓋它們? –

回答

3

你需要保護你的單引號通配符模式,否則shell將展開(這被稱爲globbing):

for file in *.zip; do 
    unzip ${file} '*.txt' 
done 

在循環的第一次迭代,*.txt不會擴展到任何東西因爲工作目錄中沒有txt文件,所以命令按預期工作。在第一次迭代之後,它擴展到所有您剛剛從第一個zip文件提取的txt文件,所以第二次及以後的迭代通配符後實際是這個樣子:

unzip ${file} file1.txt