1 つのフォルダーを複数の .zip に圧縮し、すべてを個別に解凍できるようにするにはどうすればよいでしょうか?

1 つのフォルダーを複数の .zip に圧縮し、すべてを個別に解凍できるようにするにはどうすればよいでしょうか?

私は何百万もの画像を含む大きな画像データセットを扱っており、処理の各ステップの結果を圧縮してバックアップとしてアップロードする必要があることがよくあります。

一部のデータセットは、.zip ファイルのセットとしてダウンロードでき、1 つの一貫したデータセットとして同じフォルダーに個別に解凍できることがわかりました。これは、ダウンロード -> 解凍 -> アーカイブの削除プロセスをパイプライン化できるため、非常に便利です。これは、任意の時間/サイズで以下に示すように、時間とストレージ スペースの両方の点でより効率的です。

  • 100GBの.​​zipファイルを解凍する場合、ダウンロードに5分、解凍に10分かかるとします。15分すべてのデータを取得するには、.zipの圧縮率が50%であると仮定すると、100+200 =を使用する必要があります。300GBディスクスペース。
  • 2 つの 50 GB の .zip ファイルを解凍する場合、ダウンロードにそれぞれ 2.5 分、解凍にそれぞれ 5 分かかるとします。次のように実行できます。zip1 のダウンロードに 2.5 分、zip1 の解凍に 5 分、zip2 の同時ダウンロードに 2.5 分、zip1 を削除し、zip2 を 5 分で解凍すると、合計 2.5+5+5 =12.5分一方、ディスク上に同時に保存する必要があるのは最大でzip2、folder1、folder2だけなので、50+100+100 =250GBディスク容量。

個別の zip ファイルの数が増えるにつれて、これらの時間とスペースの節約は増加します。そのため、これを実現する方法を探しています。

私の要件は次のとおりです:

  • この方法は、どんなに深いフォルダ構造でも機能します。
  • 圧縮すると.zipファイルになりますだいたい同じ大きさ
  • 結果として得られるアーカイブはすべて個別に解凍して、フォルダーの一部を再構築できます (データセットの一部のみをテストに使用したい場合もありますが、その場合はデータセット全体を解凍する必要はありません)
  • オプション:
    • このメソッドは進捗バーを表示できる必要があります
    • この方法は高速かつ効率的である

最初のいくつかの要件に適合する bash または python スクリプトを作成できると思いますが、十分な速度が得られるかどうかは疑問です。

私は zip の -s スイッチと 7z の -v スイッチを知っていますが、どちらもアーカイブのどの部分でも解凍できるようにするにはアーカイブのすべての部分をユーザーが持っている必要があり、これはあまり望ましくありません。

答え1

このタスクを支援するスクリプトがあります。以下は、ファイルを個別に ZIP アーカイブに圧縮し、個別に抽出できるようにする Bash スクリプトの例です。ファイルを含むディレクトリ内でこのスクリプトを実行して、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 アルゴリズムを使用しますが、ファイル名とメタデータも圧縮されるため、圧縮率が向上する場合があります。これを行うと、通常はアーカイブ全体を抽出してその内容を確認する必要があるという欠点があります。

関連情報