2014-10-07 63 views
2

我想寫一個腳本,解壓縮當前目錄中的所有文件,如下所示。 簡單循環展開*.zip,並解壓縮每個fbash中的空模式處理方式不同嗎?

for f in *.zip 
do 
    unzip -o $f 
done 

然而,當*.zip模式是空的,即當在當前目錄下沒有zip文件,我得到了一個錯誤:

unzip: cannot find or open *.zip, *.zip.zip or *.zip.ZIP. 

我不明白爲什麼慶典不同的處理模式當它是空的。在我看來,*.zip模式在空時被視爲字符串,而在非空時被視爲正確的模式。

我的問題是,如何解決腳本,以便它也處理空的模式?

謝謝,

回答

1

當你鍵入命令如果通配符模式不匹配任何內容,bash和類似的shell通常會按原樣保留未擴展的通配符,並且無論如何都要運行該命令。這是你學會用shell編程期望的那些技巧之一。

for f in *.zip 
do 
    test -f "$f" && unzip -o "$f" 
done 

只有在文件實際存在並且是文件時才解壓縮該文件。它還具有跳過與模式意外匹配的目錄的好處。

3

最簡單的方法是shopt -s nullglob。如果沒有找到文件,這將使bash擴展爲*.foo。殼牌選項是bashism,雖然如此,另一種方法是檢查值實際上是一個文件:

#!/bin/sh 

for f in *.zip; do 
    [ -f "$f" ] && unzip -o "$f" 
done 
+0

如果您嘗試使用POSIX兼容,則需要使用單個括號而不是雙精度。 – 2014-10-07 00:21:06

0

我會做這種方式:

find . -maxdepth 1 -name '*.zip' -execdir unzip -o {} + 
相關問題