Open1

zipで再圧縮する時に消したはずのファイルが残った話

amenashiamenashi

ただ単に驚いたのでメモ程度に残しておく。
ちなみに自分の文は見にくかったからClaude君に推敲してもらってます。

zipコマンドには、フォルダの中身を再帰的に圧縮するオプション -r が用意されています。例えば、以下のようにして hoge フォルダを hoge.zip に圧縮することができます。

zip -r hoge.zip hoge

ここで注目すべき点は、既に hoge.zip が存在する状態で、hoge フォルダの中身を変更(フォルダの追加や削除など)した後に、再度同じコマンドを実行すると、hoge.zip には変更が反映されないということです。
例えば、以下のようなフォルダ構成を考えてみましょう。

hoge/
├── folder1/
│   └── file1.txt
└── folder2/
    └── file2.txt

この状態で zip -r hoge.zip hoge を実行すると、hoge.zip は以下のような構成になります。

hoge.zip
├── folder1/
│   └── file1.txt
└── folder2/
    └── file2.txt

次に、hoge フォルダから folder2 を削除し、新たに folder3 を追加したとします。

hoge/
├── folder1/
│   └── file1.txt
└── folder3/
    └── file3.txt

この状態で再度 zip -r hoge.zip hoge を実行すると、hoge.zip は以下のようになります。

hoge.zip
├── folder1/
│   └── file1.txt
├── folder2/
│   └── file2.txt
└── folder3/
    └── file3.txt

つまり、folder2 は削除されずに残ってしまい、新たに追加された folder3 だけが反映されるのです。
この挙動に気づいた時、私は困惑して猫のミームのような顔になってしまいました。

この問題を解決するには、既存の hoge.zip を削除してから、新しく圧縮し直す。

rm hoge.zip
zip -r hoge.zip hoge

おそらく、zipコマンドは効率化のために、既存のzipファイルに対して変更分だけを反映するような設計になっているのでしょう。ただ、削除されたフォルダについても削除してくれると嬉しいのですが...。
今まで外部に提出してきたzipファイルに、いらないファイルが残っていないことを願うばかりです。