我承認這個問題之前曾在這裡被問過:
喜歡壓縮成單獨的文件詢問者沒有具體說明他所使用的作業系統,也沒有得到答案。
我需要將一個巨大的目錄分成多個彼此不依賴的 .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 *
)都是相當醜陋的語法,並且可能會被破壞,例如,在名稱中帶有空格的文件上或由於參數太多而損壞。