如何將多個檔案壓縮到單獨的存檔?

如何將多個檔案壓縮到單獨的存檔?

我承認這個問題之前曾在這裡被問過:

喜歡壓縮成單獨的文件詢問者沒有具體說明他所使用的作業系統,也沒有得到答案。

我需要將一個巨大的目錄分成多個彼此不依賴的 .zip 檔案。所以,而不是:

文件1.zip
檔2.z01
檔3.z02

我想要以下一組文件:

文件1.zip
檔2.zip
檔3.zip

基本上這是我的問題。我使用的是 OS X,因此 shell 腳本或 AppleScript 將是最簡單的方法。

此外,有一個人問了同樣的問題 - 只是他想創建一個 .tar 存檔:如何為一組文件建立單獨的存檔

答案是正確的,但會產生 tar 檔:

for file in `ls *`; do tar -czvf $file.tar.gz $file ; done

PS:最後一部分僅適合適合使用鍵盤大師的人:

我還嘗試在 Keyboard Maestro 中執行此操作,我有一個“foreach”操作設置,它確定文件路徑,然後觸發 shell 腳本。如果我將其貼到終端(例如zip /Users/me/Desktop/test /Users/me/Desktop/test.txt),輸出是正確的且巨集可以工作。

但是,當我將這兩個變數傳遞給 Keyboard Maestro 中的 shell 腳本時將無法運作:
zip "$KMVAR_zipPath" "$KMVAR_sourcePath"

答案1

解決方案非常簡單。如果您想對每個文件遞歸地執行此操作,請使用find.它將列出所有檔案和目錄,以及子目錄。

find . -type f -execdir zip '{}.zip' '{}' \;

解釋:

  • 第一個參數是您要開始的目錄,.
  • 然後我們將其限制為僅查找文件 ( -type f)
  • -execdir選項允許我們對找到的每個檔案運行命令,從檔案的目錄執行它
  • zip file.txt.zip file.txt例如,該命令被評估為,因為所有出現的{}都被替換為實際檔案名稱。該命令需要以以下方式結束\;

當然find還有更多的選擇。相反,如果您只想保留在當前目錄中,而不是下降到子目錄中:

find . -type f -maxdepth 1 -execdir zip '{}.zip' '{}' \;

如果您想將其限制為某些文件類型,請使用以下-name選項(或-iname用於不區分大小寫的匹配):

find . -type f -name "*.txt" …

在我看來,其他任何東西(包括for在 的輸出上循環ls *)都是相當醜陋的語法,並且可能會被破壞,例如,在名稱中帶有空格的文件上或由於參數太多而損壞。

相關內容