2009-10-16 34 views
0

我有一個bash shell腳本解壓zip文件,並操縱生成的文件。由於這一過程中,我希望所有我感興趣的內容是一個單一的文件夾中,像這樣:如何檢查bash中爆炸的zip文件?

file.zip 
    /file 
    /contentFolder1 
    /contentFolder2 
    stuff1.txt 
    stuff2.txt 
    ... 

我注意到用戶在Windows上通常不會創建一個子文件,而是提交一個爆炸的拉鍊看起來像這樣的文件:

file.zip 
    /contentFolder1 
    /contentFolder2 
    stuff1.txt 
    stuff2.txt 
    ... 

如何檢測這些爆炸拉鍊,以便我可以相應地處理它們?如果不先解壓縮文件,有可能嗎?

+1

爆炸拉鍊是否與拉鍊炸彈相同? – 2009-10-16 19:50:30

+0

這是一個廣泛的概念,但是,我正在檢查的拉鍊不是惡意的。我基本上只想確保當我解壓縮一個特定的zip文件時,只有一個文件夾包含zip的內容。 – 2009-10-16 19:54:49

+0

這可能屬於超級用戶。 – Avdi 2009-10-16 20:04:26

回答

2

首先解壓到一個目錄,然後刪除額外的圖層,如果zip不是炸彈。

tempdir=`mktemp -d` 
unzip -d $tempdir file.zip 
if [ $(ls $tempdir | wc -l) = 1 ]; then 
     mv $tempdir/* . 
     rmdir $tempdir 
else 
     mv $tempdir file 
fi 
0

我不會嘗試檢測它。我只是強制解壓縮來做我想做的事情。隨着InfoZip:

$ unzip -j -d unzip-output-dir FileFromUntrustedSource.zip 

-j使得它忽略文件中的任何目錄結構,並-d告訴它把文件放在一個特定的目錄,如果有必要創建它。

如果有兩個文件名稱相同,但在不同的子目錄中,則上述命令將解壓縮詢問是否要用第二個覆蓋第一個。您可以添加-o以強制在不詢問的情況下進行覆蓋,或者-f僅在第二個文件較新時覆蓋。

3

如果您想檢查,unzip -l將打印zip文件的內容而不提取它們。不過,你必須稍微按摩一下輸出,因爲它會打印各種附加的粗糙。

+0

你也可以使用zipinfo -1來控制輸出多一點,但它看起來是任意深的,所以我不得不分析每一行...... – 2009-10-16 20:33:05

+0

不,你只需要匹配所有行都以相同的東西開始(目錄名稱)後跟一個斜槓。這很容易完成,比如用'sed s /([^ /] *)\/\ 1/|排序-u'並檢查你是否只有一行輸出。 (那麼,'sed'命令可能不會像寫入的那樣工作,但你明白了。) – JaakkoK 2009-10-16 20:41:39

+0

你可能意思是更像'sed':[/ \\]。* ::'',但是想法是健全的。 – ephemient 2009-10-16 20:59:27