zipコマンドでディレクトリを圧縮する際の階層構造の扱いと、-jオプションの動作について解説します。

-jオプションなしの場合(階層構造を保持)

通常、zipコマンドでディレクトリを圧縮すると、階層構造がそのまま保たれます

# ディレクトリmyfolderを圧縮
zip -r archive.zip myfolder/
 
# 解凍すると
unzip archive.zip
# → myfolder/というディレクトリが作られ、その中にファイルが展開される

これにより、圧縮したディレクトリの構造がそのまま維持されます。

-jオプションありの場合(階層構造を無視)

-jオプション(junk paths)を使用すると、ディレクトリ構造が無視され、すべてのファイルがフラットに格納されます。

# -jオプションを使用してディレクトリを圧縮
zip -j -r archive.zip myfolder/
 
# 解凍すると
unzip archive.zip
# → myfolder/というディレクトリは作られず、
#   myfolder内のファイルが直接現在のディレクトリに展開される

注意点

  • -jオプションを使うと、同名ファイルが存在する場合は上書きされる可能性があります
  • ディレクトリ構造の情報が失われるため、元の構造を復元できません

ディレクトリを保持した圧縮方法

ディレクトリを圧縮して、解凍時にもディレクトリが出てくるようにするには:

推奨方法

# 1. 対象ディレクトリの親ディレクトリに移動
cd /path/to/parent/directory
 
# 2. -jオプションを使わずに圧縮
zip -r archive.zip myfolder/
 
# この方法により、解凍時にmyfolder/ディレクトリが正しく作成されます

具体例

# 例:/home/user/documents/project を圧縮したい場合
 
# 1. documentsディレクトリに移動
cd /home/user/documents
 
# 2. projectディレクトリを圧縮
zip -r project.zip project/
 
# 解凍すると
unzip project.zip
# → project/ディレクトリが作られ、その中にファイルが展開される

まとめ

オプション階層構造解凍時の動作
なし保持されるディレクトリ構造がそのまま復元
-j無視される全ファイルがフラットに展開

ベストプラクティス: ディレクトリを圧縮する際は、目的のディレクトリの親ディレクトリに移動してから、-jオプションなしで圧縮することで、意図した通りの構造を維持できます。