Skip to content
Back to Blog
how-to-convert

ZIPをTARに変換する方法(Linuxサーバー移行編)

2026-05-17 9 min read

ZIPとTARがなぜ別世界に存在するのか

ZIPとTARは、それぞれ異なるコンピューティング思想から生まれました。ZIPは1989年にDOSとWindows向けに登場し、アーカイブ化と圧縮を1つのパッケージにまとめています。ファイルを個別に扱うため、アーカイブ全体を解凍しなくても単一のファイルを抽出でき、Windows形式のメタデータを追跡します。一方、TAR(Tape ARchiveの略)は純粋なUnix生まれです。その役割はただ1つ、ファイルを1つのストリームに連結すること。それだけです。圧縮は別のステップで、通常はgzip(.tar.gz)やbzip2(.tar.bz2)のようなツールが担当します。 この違いは単なる豆知識ではありません。Linuxサーバーの移行においては、非常に大きな実践的な意味を持ちます。Windows開発者やcPanelのバックアップからZIPファイルを受け取って、いざデプロイしようとすると、突然パーミッションエラーやシンボリックリンクの破損、メタデータの消失といった問題に見舞われることになります。TARは、まさにZIPが無視してしまう Unixのファイルパーミッション(`chmod 755`や`644`といった設定)、所有者情報、シンボリックリンク、ハードリンクを保持するために作られました。これは本当に助かります。 よくある悪夢のようなシナリオは、WindowsでZIP化されたWordPressサイトです。`wp-cron.php`スクリプトの実行権限が失われたり、重要なシンボリックリンクがただのファイルになって機能しなくなったりします。同じプロジェクトをApacheやNginxサーバーにデプロイする前に、まず.tar.gzとして再パッケージ化することで、これらの問題をすべて回避できます。ZIPからTARへの変換は単なる好みの問題ではなく、スムーズで予測可能な移行のために必要なステップなのです。

最速の方法:中小規模アーカイブ向けのCocoConvert

2GB未満のアーカイブを扱う場合、最も速い解決策はオンラインツールです。たった1回の変換のために一時的なVMを立ち上げた経験がある人なら誰でも、時には「今すぐこの問題を解決したい」と思うものです。そんな時は、クラウドを使いましょう。CocoConvertの[ZIPからTARへのコンバーター](/convert/zip-to-tar)は、展開と再パッケージ化の全プロセスをサーバー上で処理してくれます。何もインストールする必要はありません。 使い方はシンプルです: 1. [cocoConvert.com/convert/zip-to-tar](/convert/zip-to-tar)にアクセスします。 2. .zipファイルをページにドラッグするか、「ファイルを選択」ボタンを使います。 3. 出力形式を選択します。通常の.tar、圧縮された.tar.gz、または.tar.bz2が選べます。 4. 「変換」をクリックします。500MBのZIPファイルなら、サーバーの混雑状況にもよりますが、通常30秒から90秒ほどで完了します。 5. 完成したTARアーカイブをダウンロードします。自分のコンピュータに保存するか、提供されたリンクを使って`wget`でサーバーに直接ダウンロードすることもできます。 どのフォーマットを選ぶかについてのアドバイスです。ディスクスペースが限られているサーバーでは、.tar.gzが最善の選択です。テキストベースのコードなら、通常60〜70%もサイズを削減できます。古いハードウェアでより高速な解凍が必要で、ファイルサイズが少し大きくなっても構わない場合は、.tar.bz2も良い選択肢ですが、作成には時間がかかります。 ただし、制限については明確にしておきましょう。CocoConvertは、手軽な1回限りの作業に最適です。2GBを超えるアーカイブ、暗号化されたZIPファイル、または特定のUnix ACL(アクセス制御リスト)の完全な保持が求められる状況には設計されていません。そういったヘビーなタスクには、次に説明するコマンドラインを使う必要があります。

Linuxコマンドラインでの変換:大規模アーカイブ向けの確実な方法

大規模なアーカイブや、すでにリモートサーバー上にあるファイル、あるいは複雑なパーミッションを持つファイルには、コマンドラインが最高の相棒です。完全なコントロールが可能になります。必要なのは、ほとんどすべてのLinuxシステムにインストールされている2つのユーティリティ、`unzip`と`tar`だけです。 まず、これらがインストールされているか確認しましょう: ``` which unzip tar ``` Debian/Ubuntuでは `sudo apt install unzip tar` で、RHEL/CentOS/AlmaLinuxでは `sudo dnf install unzip tar` でインストールできます。 プロセス自体はシンプルです。ZIPアーカイブを一時ディレクトリに解凍し、そのディレクトリをTARファイルとして再パックします。まず、ZIPを展開します: ``` unzip archive.zip -d ./extracted_content ``` `-d`フラグの使用は必須です。これにより、コンテンツ専用のディレクトリが作成されます。これを忘れると、`unzip`がカレントディレクトリにファイルをばらまいてしまい、手作業でクリーンアップしなければならない大混乱を引き起こします。 次に、これをTARアーカイブにパッケージ化します: ``` tar -czf archive.tar.gz -C ./extracted_content . ``` これらのフラグを分解してみましょう。`-c`は新しいアーカイブを作成、`-z`はgzip圧縮を追加、`-f`は出力ファイル名を設定します。ここでの真のヒーローは`-C`フラグです。これは`tar`に対し、アーカイブを開始する前に`extracted_content`ディレクトリに移動するよう指示します。最後の`.`は、その新しいカレントディレクトリ内のすべてをアーカイブするよう指示します。このちょっとしたテクニックにより、アーカイブ内に余分な不要なフォルダ階層ができてしまうのを防げます。これはデプロイパスを壊しかねない典型的なミスです。 別の圧縮形式が必要ですか?.tar.bz2の場合は、`-z`を`-j`に置き換えるだけです: ``` tar -cjf archive.tar.bz2 -C ./extracted_content . ``` また、ファイルがすでに圧縮済み(画像や動画など)の場合は、圧縮なしのプレーンなTARを作成できます: ``` tar -cf archive.tar -C ./extracted_content . ``` 一時ディレクトリを削除する前に、必ず簡単なサニティチェックを実行して、アーカイブが有効であることを確認しましょう: ``` tar -tzf archive.tar.gz | head -20 ``` このコマンドは最初の20ファイルを表示します。構造が正しければ、準備完了です。

移行時のファイルパーミッションと所有権の扱い方

ここは注意してください。なぜなら、ほとんどのZIPからTARへの移行が失敗するのはこのステップだからです。問題はパーミッションです。ZIPにはファイル属性用の16ビットのフィールドがありますが、OS間での一貫性が全くありません。macOSから来たZIPは正しく処理されるかもしれませんが、Windows標準のアーカイバで作られたZIPはほぼ確実に間違っています。 Linux上で`unzip`を実行すると、ツールはパーミッションを推測しようと最善を尽くします。通常、システムのumask(一般的には022)に基づいて、ファイルには644、ディレクトリには755がデフォルトで設定されます。これはほとんどのWebアセットにとっては問題ありませんが、実行権限が必要なスクリプトにとっては致命的です。 唯一の確実な解決策は、TARアーカイブを作成する*前*に自分でパーミッションを修正することです。`find`を使って確認し、修正しましょう: ``` # すべてのファイルを安全なデフォルト(644)に設定 find ./extracted_content -type f -exec chmod 644 {} \; # すべてのディレクトリを安全なデフォルト(755)に設定 find ./extracted_content -type d -exec chmod 755 {} \; # スクリプトに明示的に実行権限を付与 find ./extracted_content -name '*.sh' -exec chmod 755 {} \; ``` 所有権はパズルのもう半分のピースです。Webアプリケーションを移行する場合、そのファイルは`www-data`(Debian/Ubuntuの場合)や`nginx`または`apache`(RHEL系の場合)によって所有される必要があります。特にデプロイスクリプトがそれに依存している場合は、アーカイブを作成する前に所有権を設定してください: ``` sudo chown -R www-data:www-data ./extracted_content ``` TARは、アーカイブを作成した瞬間の所有権とパーミッションを忠実に保持します。これらを事前に正しく設定しておけば、デプロイは単なる展開作業になり、デプロイ後の面倒な`chmod`スクリプトは不要になります。自動化されたデプロイメントにとって、これはZIPファイルと格闘するよりもはるかに大きな運用上のメリットです。

移行スクリプトでのZIPからTARへの変換の自動化

複数のファイルを変換する場合は、自動化しましょう。何十ものサイトを移行する場合でも、cPanelサーバーからの週次ZIPバックアップを処理する場合でも、スクリプトを使えば大幅な時間を節約し、単純なミスを防ぐことができます。 このシェルスクリプトは、優れた出発点になります。ソースディレクトリ内のすべてのZIPファイルを見つけ、変換し、結果のTARファイルを宛先ディレクトリに配置します。 ```bash #!/bin/bash SOURCE_DIR="/srv/backups/zip" DEST_DIR="/srv/backups/tar" TMP_DIR="/tmp/zip_conversion" mkdir -p "$DEST_DIR" "$TMP_DIR" for zipfile in "$SOURCE_DIR"/*.zip; do basename=$(basename "$zipfile" .zip) extract_path="$TMP_DIR/$basename" echo "Processing: $basename" mkdir -p "$extract_path" unzip -q "$zipfile" -d "$extract_path" # Fix permissions find "$extract_path" -type f -exec chmod 644 {} \; find "$extract_path" -type d -exec chmod 755 {} \; tar -czf "$DEST_DIR/${basename}.tar.gz" -C "$extract_path" . # Verify before cleanup if tar -tzf "$DEST_DIR/${basename}.tar.gz" > /dev/null 2>&1; then echo "Success: ${basename}.tar.gz" rm -rf "$extract_path" else echo "ERROR: Conversion failed for $basename" >&2 fi done rm -rf "$TMP_DIR" ``` これを使うには、コードを`convert_zips.sh`として保存し、`chmod 755 convert_zips.sh`で実行可能にしてから、`./convert_zips.sh`で実行します。安全チェックに注目してください。スクリプトは、一時的に展開したファイルを削除する前に、新しいTARアーカイブが読み取り可能であることを検証します。これは、`tar`コマンド中に何か問題が発生した場合に、誤ってデータを失うのを防ぐための重要なステップです。 これを自動的に実行するには、cronジョブに追加するだけです。この例では、毎日午前2時にスクリプトを実行し、すべての出力をログに記録します:`0 2 * * * /srv/scripts/convert_zips.sh >> /var/log/zip_conversion.log 2>&1`。

よくあるエラーとその修正方法

遅かれ早かれ、変換は失敗します。よくあることです。ここでは、ZIPからTARへの変換で遭遇する最も一般的なエラーとその解決方法を紹介します。 **'End-of-central-directory signature not found'** これは、ほぼ間違いなくZIPファイルが破損しているか、不完全であることを意味します。元のソースとサイズを比較し、再度ダウンロードしてみてください。最後の手段として、修復を試みることもできます:`zip -FF corrupted.zip --out repaired.zip` **unzip中の'Cannot allocate memory'** これは通常、RAMの問題ではありません。ファイルディスクリプタの問題です。何百万もの小さなファイルを含むアーカイブは、システムの制限を使い果たす可能性があります。現在のシェルセッションの制限を`ulimit -n 65536`で引き上げてから、再試行してください。 **TAR内でシンボリックリンクが欠落する** シンボリックリンクがリンクパスを保持する単なるテキストファイルになってしまう場合、それらを誤って処理する古いバージョンの`unzip`を使用している可能性があります(一部のバージョンでは`-X`フラグが必要でした)。`unzip -v`で確認し、6.0より古いものを使用している場合はアップグレードしてください。より堅牢な代替案は、シンボリックリンクの保持に優れたPythonの`zipfile`モジュールを使用することです:`python3 -c "import zipfile; zipfile.ZipFile('archive.zip').extractall('extracted/')"` **スペースを含むファイル名がtarを壊す** ああ、古典的な「スペースを含むファイル名」問題ですね。これは、パーミッション修正に使用される単純な`find`コマンドを失敗させることがあります。これを確実に対処する方法は、`find`の`-print0`オプションを`xargs -0`にパイプすることです:`find ./extracted_content -type f -print0 | xargs -0 chmod 644` **アーカイブが/tmpには大きすぎる** 多くのシステムでは`/tmp`がRAM内の`tmpfs`パーティションとして構成されており、しばしば総メモリの半分に制限されています。アーカイブが巨大な場合、これは失敗します。`unzip`に実際のディスク上の別の一時ディレクトリを使用するように指示する(`export TMPDIR=/var/tmp`)か、より良い方法として、`-d`フラグで直接ディスク上の展開パスを指定します。 **CocoConvertで大きなファイルがタイムアウトする** 当社のWebツールは利便性のために作られており、巨大なファイル用ではありません。2GBを超えるものはタイムアウトする可能性が高いです。これはほとんどのブラウザベースのアップロードにおけるハードリミットです。大きな作業には、コマンドラインメソッドを使用する必要があります。

サーバー環境に適したTAR圧縮形式の選び方

TARと組み合わせる圧縮形式は単なる詳細ではありません。移行速度、ディスク使用量、さらにはデプロイ時のサーバーパフォーマンスにも影響します。ここでは、適切なものを選ぶ方法を説明します。 **.tar.gz (gzip)** これが業界標準であるのには理由があります。優れた圧縮率(コードでは通常3:1から5:1)を提供し、解凍も高速(現代のサーバーでは1GBの.tar.gzが約15秒で展開)で、普遍的にサポートされています。私のアドバイスですか?これを使ってください。何か非常に特殊で、やむを得ない理由がない限り、.tar.gzが正解です。 **.tar.bz2 (bzip2)** これはgzipよりも約10〜15%小さいファイルになりますが、大きな代償が伴います。圧縮は3〜4倍遅くなります。解凍も遅いです。これは、アクティブなデプロイメントではなく、1ギガバイトでも節約したい長期的なアーカイブにのみ意味のあるトレードオフです。 **.tar.xz (xz/LZMA)** これは最高の圧縮率を提供し、ソースコードをgzipよりも20〜30%多く縮小することがよくあります。しかし、解凍は遅く、メモリを大量に消費します。500MBの.tar.xzは、展開するだけで700MBのRAMを簡単に消費する可能性があります。特にリソースが限られたサーバーにデプロイする場合は、移行にこれを使用するのは避けるべきです。 **.tar (圧縮なし)** すでに圧縮されているものを圧縮しないでください。アーカイブがJPEG画像、MP4動画、または事前に圧縮されたデータベースダンプでいっぱいの場合、それをgzipでラップするのは、サイズ上のメリットがほとんどないのにCPUサイクルを無駄にするだけです。この場合、プレーンな.tarが最も効率的な選択です。 PHPアプリケーション、Node.jsプロジェクト、Pythonコードベースなど、Web関連のほぼすべての移行において、.tar.gzが最適です。Capistrano、Deployer、Ansibleのunarchiveモジュールのようなデプロイメントツールが期待する形式であり、速度、サイズ、互換性のスイートスポットを突いています。 一度きりの変換で、コマンドラインフラグの詳細に立ち入りたくない場合は、CocoConvertの[ZIPからTARへのコンバーター](/convert/zip-to-tar)が、最も実用的な選択肢(.tar、.tar.gz、.tar.bz2)をブラウザ上で提供してくれます。ただ仕事を終わらせたいときには、良い近道です。

Ready to convert?

Try it now — fast, secure, and private.

Convert Now →
ZIPをTARに変換する方法(Linuxサーバー移行編) | CocoConvert Blog