如何將一個資料夾壓縮為多個.zip,並且全部可獨立解壓縮?

如何將一個資料夾壓縮為多個.zip,並且全部可獨立解壓縮?

我處理一些包含數百萬張圖像的大型圖像資料集,並且經常需要壓縮每個處理步驟的結果以作為備份上傳。

我發現某些資料集可以作為一組 .zip 檔案下載,這些檔案可以作為一個一致的資料集獨立解壓縮到同一資料夾中。這非常方便,因為它使我能夠管道式下載 -> 解壓縮 -> 刪除存檔過程,這在時間和存儲空間方面都更有效,如下所示任意時間/大小:

  • 解壓縮單一 100GB .zip 時,假設下載需要 5 分鐘,解壓縮需要 10 分鐘。我需要15分鐘取得我的所有數據。假設 .zip 的壓縮率為 50%,我需要使用 100+200 =300GB磁碟空間。
  • 當解壓縮兩個 50GB 的 .zip 時,假設下載每個需要 2.5 分鐘,解壓縮每個需要 5 分鐘。我可以這樣做:2.5分鐘下載zip1,5分鐘解壓縮zip1,2.5分鐘同時下載zip2,刪除zip1,然後在5分鐘內解壓縮zip2,總共2.5+5+5 =12.5分鐘。同時,我只需要同時在磁碟上最多有 zip2、folder1 和folder2,所以 50+100+100 =250GB磁碟空間。

隨著單獨 zip 檔案數量的增加,時間和空間的節省也會增加。因此,我正在尋找一種方法來做到這一點。

我的要求是這樣的:

  • 此方法適用於任何資料夾結構,無論多深
  • 壓縮結果為 .zip 文件大致大小相等
  • 所有產生的檔案都可以獨立解壓縮以重建資料夾的一部分(有時我可能只想使用部分資料集進行測試,在這種情況下我不想解壓縮整個資料集)
  • 選修的:
    • 該方法應該能夠顯示進度條
    • 該方法快速且有效率

我想我能夠編寫一個滿足前幾個要求的 bash 或 python 腳本,但我懷疑它是否足夠快。

我知道 zip 中的 -s 開關和 7z 中的 -v 開關,但它們都要求用戶擁有存檔的所有部分才能解壓縮它的任何部分,這是不太理想的。

答案1

我有一個腳本可以幫助完成此任務。下面是一個 Bash 腳本範例,將檔案單獨壓縮到不同的 ZIP 檔案中,使它們可以單獨提取。您可以在包含檔案的目錄中執行此腳本以產生 ZIP 檔案。我已經測試了這個過程,Python,特別是 Pandas,可以輕鬆讀取這些檔案,而無需手動提取。

#!/bin/bash

# Set the target directory
target_directory="/path/to/your/directory"

# Navigate to the target directory
cd "$target_directory" || exit

# Iterate through files in the directory
for file in *.csv; do
  if [ -f "$file" ]; then
    # Build the target ZIP file name
    zip_file="${file}.zip"

    # Check if the target ZIP file already exists, if yes, skip compression
    if [ -f "$zip_file" ]; then
      echo "File $zip_file already exists. Skipping compression."
    else
      # Compress the file
      zip "$zip_file" "$file"
      if [ $? -eq 0 ]; then
        echo "File $file compressed successfully into $zip_file."
        # Remove the original CSV file after successful compression
        rm "$file"
      else
        echo "File $file compression failed."
      fi
    fi
  fi
done

在目錄中執行此腳本將為每個 CSV 檔案建立單獨的 ZIP 文件,並在成功壓縮後刪除原始 CSV 檔案。

答案2

ZIP 檔案格式實際上只是一個包含壓縮檔案的容器(基本上是一個資料夾)。這與 Linux 平台上經常使用的 .tar.gz 格式形成對比。 ZIP 的優點是可以完全按照您希望的方式單獨提取內容,而無需提取整個檔案。

事實上,包括 Windows 在內的大多數作業系統本身都支援開啟 ZIP 資料夾來查看檔案名稱和元數據,而無需提取整個存檔。提取大型目錄結構的子集並不困難(在 Windows 中,您可以簡單地複製貼上選定的檔案)
7-拉鍊也可以執行此操作,但您必須按下「複製」按鈕,然後指定目的地。

嵌套 .zip 檔案有問題,通常必須完全提取父 .zip 才能查看子檔案。

順便說一句,我提到的 .tar.gz 格式使用與 ZIP 相同的 DEFLATE 演算法,但有時它可以壓縮得更好,因為檔案名稱和元資料也被壓縮。這樣做的代價是通常必須提取整個檔案才能查看其中的任何內容。

相關內容