2010-04-25 109 views
6

我已經看到了循環來解壓縮目錄中的所有zip文件。不過,我跑在此之前,我寧願知道我快要運行會工作的時候:shell循環可以解壓縮目錄中的所有文件嗎?

for i in dir; do cd $i; unzip '*.zip'; rm -rf *.zip; cd ..; done 

基本上我希望它看起來在「目錄」輸出中看到所有文件夾,每個目錄cd進入它,解壓縮所有的zip壓縮文件,然後刪除它們,然後再回來再做,直到沒有更多。

這是我應該做的一個單一的命令,或者我應該考慮在Perl中這樣做嗎?

+1

你好,歡迎來到StackOverflow。爲使您的代碼更具可讀性,請使用代碼標籤 – 2010-04-25 16:43:22

+1

作爲您的信息,您可以使用cd - 回到以前的目錄。 – Aif 2010-04-25 16:47:48

+0

@帕特里克完成:) – DVK 2010-04-26 00:45:44

回答

1

部分地進行了測試:

find . -type d -exec sh -c "cd \"{}\" ; unzip \"*.zip\" ; rm \"*.zip\" " \; 

執行cd/unzip/rm鏈爲每一個子目錄。

+0

到目前爲止,這個作品中,其他答案不能像「文件夾名稱與空間」一樣,但不能刪除.zip存檔。 – helpwithshell 2010-04-25 17:01:28

+0

我認爲你必須使用'find ... | xargs -0 ...'來處理空白,或者逃脫的引號做這個工作嗎? – Anycorn 2010-04-25 17:06:18

+0

最後我能夠修改你的命令行到: 找。 -name「* .zip」-exec sh -c「rm -rf \」{} \「」\; 刪除所有剩餘的.zip壓縮文件。謝謝 – helpwithshell 2010-04-25 17:18:40

1

使用*來得到當前目錄的內容:

for i in *; do cd "$i"; ...etc... ; done 

你也應該確保的東西是試圖cd到前一個目錄。

if [ -d "$i" ]; then ...etc... ; fi 

你也應仔細檢查解壓縮操作刪除壓縮文件之前成功:在bash此如下完成。不需要使用遞歸強制刪除來刪除單個文件。

我認爲這是推動一個單一的行合理的限制。把它放到一個shell腳本中並在多行上格式化。

2

你應該一般很好。只需在循環中加上前綴echo的前綴進行調試就可以告訴你變量是如何擴展的。您也可以始終使用rm -i,而不是讓rm繼續使用-f

您的unzip調用中的單引號將只解壓縮名爲*.zip的文件,即*不會擴展。改爲使用雙引號(或根本沒有引號)。

您的循環現在假設所有目錄$i都直接在當前目錄下。更通用的解決方案是使用目錄堆棧(pushdpopd);

for i in $dir; do 
    pushd $i 
    unzip *.zip 
    rm -rf *.zip 
    popd 
done 
+0

我不得不改變第一個從我在迪爾爲我在*,它unziped的東西,但有問題的文件,其中包含空格的名稱。 – helpwithshell 2010-04-25 16:54:31

+0

@help:我隱含地認爲'dir'是一個變量,當它不是我的例子是錯誤的。現在修復並假定'dir'是一個保存目錄列表的變量。 – 2010-04-25 17:02:48

2

的幾點加到其他人所說:

  • 如果你把單引號內的參數,如在'*.zip',外殼不會做野卡擴展並解壓縮會嘗試處理存檔這就是所謂的*.zip
  • 如果您只想刪除單個文件,請不要使用-r作爲rm的參數。這是不必要的危險,因爲任何遞歸刪除的子目錄可能不會被打算。
  • 您應該檢查的unzip返回代碼且僅當解壓縮成功刪除的zip文件(例如,你可以說​​,甚至用一個明確的for循環來處理壓縮文件逐個)
0

當你想知道,如果一個事情會工作,但提防它的破壞性後果,做一些在同一時間:

確保你得到正確的文件:

for i in dir; do cd $i; echo $i; cd ..; done 

確保您可以解壓縮文件在刪除文件之前:

for i in dir; do cd $i; unzip '*.zip'; cd ..; done 

而且,你做充分的蒙蒂之前,讓您的目錄的備份。

相關問題