Linux: アーカイブと圧縮 — tar / gzip / zipとデータバックアップ

データバックアップは運用の生命線です。Linuxでは、tar + gzipが最も普遍的なアーカイブソリューションで、rsyncが最も強力な差分同期ツールです。

📋 前提条件:まず以下を完了していること

1. このレッスンで学ぶこと


2. 「除外パラメータを忘れた」ストーリー

(1) 悩み:入れるべきでないものまでアーカイブに

小明はプロジェクトフォルダーを同僚に送る必要がありました — チームのルールでnode_modules.gitディレクトリは大きすぎて不要なため転送しないことになっていました。

(2) 1コマンドで完璧なアーカイブ

BASH
tar -czf project.tar.gz \
    --exclude=node_modules \
    --exclude=.git \
    --exclude=__pycache__ \
    project/

(3) 得られるもの:クリーンなパッケージ

小明の圧縮アーカイブは500MB(node_modules込み)から2MBに減りました。同僚は展開後すぐに使えました。


3. 知識ポイント

(1) tar — アーカイブツール

BASH
# Create tar archive
tar -cf archive.tar file1 file2 dir/    # Archive
tar -czf archive.tar.gz dir/            # Archive + gzip compression

> 💡 ヒント:`tar -czf`オプションの覚え方 — `c`(作成)、`z`(gzip圧縮)、`f`(ファイル名指定)。これが最も一般的な組み合わせで、結果の`.tar.gz`ファイルはLinux世界の標準配布フォーマットです。展開する時は`c`を`x`(展開)に替えるだけ:`tar -xzf`。
tar -cjf archive.tar.bz2 dir/           # Archive + bzip2 compression
tar -cJf archive.tar.xz dir/            # Archive + xz compression

# Extract
tar -xf archive.tar                     # Extract (auto-detects format)
tar -xzf archive.tar.gz                 # Extract .tar.gz
tar -xf archive.tar -C /target/dir/     # Extract to specified directory

# View contents
tar -tf archive.tar.gz                  # Preview file list inside archive

> ⚠️ 警告:tarアーカイブを展開する前に、`tar -tf`でファイルリストをプレビューしてください — 「爆弾ファイル」(例:大量の小さなファイルに展開されるもの、または`/`で始まる絶対パス)がないことを確認し、システムファイルの上書きやディスク容量の枯渇を防ぎます。

# Exclude
tar -czf backup.tar.gz --exclude="*.log" --exclude=node_modules dir/
tarオプション 意味
-c アーカイブ作成
-x 展開
-t 内容一覧表示
-f アーカイブファイル名指定
-z gzipで圧縮
-j bzip2で圧縮
-J xzで圧縮
-v 処理ファイルを表示
-C 指定ディレクトリに展開
--exclude パターンに一致するファイルを除外

(2) 圧縮アルゴリズム比較

アルゴリズム 拡張子 オプション 圧縮率 速度 用途
gzip .gz -z 日常のバックアップと配布
bzip2 .bz2 -j より高い圧縮が必要な場合
xz .xz -J 最高 最遅 長期アーカイブ、最小サイズ

(3) zip/unzip — クロスプラットフォーム圧縮

TEXT
# Compress
zip -r project.zip project/             # Recursively compress directory
zip -r project.zip project/ -x "*.git*" # Exclude .git
zip -r project.zip project/ -P password # Encrypt

# Extract
unzip project.zip                       # Extract to current directory
unzip project.zip -d /target/dir/       # Extract to specified directory
unzip -l project.zip                    # View contents without extracting

# zip advantage: natively supported on all operating systems

(4) rsync — 差分同期

BASH
# Basic usage
rsync -av source/ destination/          # Local sync (recursive + preserve attributes)
rsync -av --delete source/ dest/        # Sync and delete files in dest that aren't in source

> ℹ️ 注意:`rsync --delete`は送信先を送信元と完全に一致させます — 送信先にあって送信元にないファイルは削除されます。間違えた場合(例:送信元パスの間違い)、送信先の大量データが削除される可能性があります。実行前に必ず`--dry-run`でプレビューしてください。
rsync -avz source/ user@host:/dest/     # Remote sync (compressed transfer)
rsync -avz -e "ssh -p 2222" source/ host:/dest/  # Specify SSH port

# Exclude
rsync -av --exclude="node_modules" --exclude=".git" src/ dst/

# Incremental backup (hard links)
rsync -av --link-dest=../backup-yesterday/ src/ backup-today/

rsyncの利点:

(5) ▶ サンプル:tarアーカイブと展開

TEXT
# Archive the projects directory under home
tar -czf projects-backup.tar.gz ~/projects/

# View archive contents
tar -tf projects-backup.tar.gz | head -10

# Extract to /tmp
tar -xzf projects-backup.tar.gz -C /tmp/

# With verbose output
tar -czvf my-backup.tar.gz --exclude="*.log" /var/log/

(6) ▶ サンプル:圧縮アルゴリズム比較

BASH
# Prepare test data
mkdir -p /tmp/compress-test
cp -r /usr/share/doc/* /tmp/compress-test/ 2>/dev/null

# gzip
time tar -czf test.tar.gz -C /tmp compress-test
ls -lh test.tar.gz

# bzip2
time tar -cjf test.tar.bz2 -C /tmp compress-test
ls -lh test.tar.bz2

# xz
time tar -cJf test.tar.xz -C /tmp compress-test
ls -lh test.tar.xz

# Comparison results
# Typically: test.tar.gz is largest but fastest, test.tar.xz is smallest but slowest

出力:

TEXT
-rw-r--r-- 1 alice alice 1.2M test.tar.gz

real    0m0.234s
user    0m0.198s
sys     0m0.036s
-rw-r--r-- 1 alice alice 856K test.tar.bz2

real    0m1.456s
user    0m1.389s
sys     0m0.067s
-rw-r--r-- 1 alice alice 612K test.tar.xz

real    0m5.123s
user    0m4.987s
sys     0m0.136s

(7) ▶ サンプル:zipクロスプラットフォーム配布

TEXT
# Archive a project (excluding unneeded directories)
cd ~/projects
zip -r myapp.zip myapp/ -x "myapp/node_modules/*" "myapp/.git/*" "myapp/__pycache__/*"

# View contents
unzip -l myapp.zip | head -20

# Encrypt archive
zip -r -e secret.zip confidential/    # Will prompt for password

(8) ▶ サンプル:rsyncバックアップ

BASH
# Local backup
rsync -av --delete ~/projects/ /backup/projects/

# Remote backup to server
rsync -avz -e "ssh -i ~/.ssh/mykey" \
    --exclude="node_modules" \
    --progress \
    ~/projects/ user@backup-server:/backups/

# Incremental backup (using hard links)
# Day 1
rsync -av /data/ /backup/2026-07-07/

# Day 2 (only stores changes)
rsync -av --link-dest=/backup/2026-07-07/ /data/ /backup/2026-07-08/

出力:

TEXT
sending incremental file list
sent 1,234 bytes  received 512 bytes  2,492.00 bytes/sec
total size is 5.6M  speedup is 3,210.45

sending incremental file list
app.js
config.yaml
sent 4,567 bytes  received 128 bytes  9,390.00 bytes/sec
total size is 5.6M  speedup is 1,197.23

(9) ▶ サンプル:自動バックアップスクリプト

BASH
#!/bin/bash
# auto-backup.sh - Automated backup of critical directories

BACKUP_ROOT="/backup"
DATE=$(date +%Y%m%d)
RETENTION_DAYS=30

# Directories to back up
declare -A DIRS
DIRS["projects"]="$HOME/projects"
DIRS["configs"]="/etc"
DIRS["notes"]="$HOME/notes"

echo "=== Starting backup: $DATE ==="

# Create backup directory
mkdir -p "$BACKUP_ROOT/$DATE"

for name in "${!DIRS[@]}"; do
    src="${DIRS[$name]}"
    dest="$BACKUP_ROOT/$DATE/$name.tar.gz"
    
    if [ -d "$src" ]; then
        echo "Backing up $src → $dest"
        tar -czf "$dest" \
            --exclude="node_modules" \
            --exclude=".git" \
            --exclude="*.log" \
            "$src" 2>/dev/null
        echo "  ✅ $(du -h "$dest" | cut -f1)"
    else
        echo "  ⚠️ Directory does not exist: $src"
    fi
done

# Delete expired backups
echo ""
echo "Cleaning backups older than $RETENTION_DAYS days..."
find "$BACKUP_ROOT" -maxdepth 1 -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \;

echo "=== Backup complete ==="

出力:

TEXT
=== Starting backup: 20260707 ===
Backing up /home/alice/projects → /backup/20260707/projects.tar.gz
  ✅ 12M
Backing up /etc → /backup/20260707/configs.tar.gz
  ✅ 4.5M
Backing up /home/alice/notes → /backup/20260707/notes.tar.gz
  ✅ 256K

Cleaning backups older than 30 days...
=== Backup complete ===

(10) ▶ 総合例:rsync完全バックアップソリューション

BASH
#!/bin/bash
# rsync-backup.sh - Incremental backup using rsync

SOURCE="$HOME/projects/webapp"
DEST_USER="backup"
DEST_HOST="backup.example.com"
DEST_PATH="/backups/webapp"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOGFILE="/var/log/backup.log"

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOGFILE"
}

log "Starting backup of $SOURCE..."

# Perform remote incremental backup using rsync
rsync -avz \
    --delete \
    --partial \
    --progress \
    --exclude="node_modules" \
    --exclude=".git" \
    --exclude=".env" \
    --exclude="tmp/" \
    -e "ssh -i ~/.ssh/backup_key -p 22" \
    "$SOURCE/" \
    "${DEST_USER}@${DEST_HOST}:${DEST_PATH}/current/" >> "$LOGFILE" 2>&1

if [ $? -eq 0 ]; then
    log "✅ Backup succeeded"
    # Create timestamped snapshot
    ssh -i ~/.ssh/backup_key "${DEST_USER}@${DEST_HOST}" \
        "cp -al ${DEST_PATH}/current ${DEST_PATH}/${TIMESTAMP}"
    log "✅ Snapshot created: $TIMESTAMP"
else
    log "❌ Backup failed (exit code: $?)"
    exit 1
fi

❓ よくある質問

Q: tarとgzipの関係は? A: tarはアーカイブのみ(複数ファイルを1つにまとめる)を処理し、圧縮は行いません。gzipが圧縮を処理します。一般的な組み合わせtar -czfはtarアーカイブ→gzip圧縮と同等です。ファイル拡張子:.tar.gzまたは.tgz

Q: tar -czf-c-z-fの意味は? A: -c(作成)アーカイブを作成、-z(gzip)gzipで圧縮、-f(ファイル)アーカイブファイル名を指定。省略形tar -czftar -c -z -fとも書けます。

Q: クロスプラットフォーム用途ではzipとtar.gzどちらが良い? A: zipの方がクロスプラットフォーム互換性が高い — Windows/macOS/Linuxすべてがネイティブサポート。tar.gzはLinux/Unix世界の標準で、Windowsでは7-Zipなどのサードパーティツールが必要。

Q: rsyncがscpより速い理由は? A: rsyncは差分転送アルゴリズムを使用 — ファイルの変更された部分のみ送信。scpは常にファイル全体をコピー。同じファイルに小さな変更があった繰り返し転送では、rsyncがはるかに高速。

Q: フルバックアップではなく差分バックアップにするには? A: rsyncはデフォルトで差分のみ転送。--link-destと組み合わせてハードリンクスナップショットを作成:初回はフル、以降毎日--link-destで前日のスナップショットを参照し、変更分のみ保存。


📖 まとめ


📝 練習問題

  1. 基本(難易度 ⭐)~/projectsまたはテストディレクトリをbackup.tar.gzとしてアーカイブし、-vで過程を観察した後、tar -tfでアーカイブ内のファイルリストを確認する
  2. 中級(難易度 ⭐⭐)/tmp/testに展開してファイルの整合性を確認し、テストディレクトリを作成してzipで圧縮(サブディレクトリを除外)し、別の場所にunzipする
  3. 上級(難易度 ⭐⭐⭐):rsyncでローカルディレクトリを/tmp/backup/に同期し、差分転送を確認(ファイルを変更して再度同期、変更分のみ転送されたことを確認)した後、tar.gzフルバックアップとrsync差分バックアップ両モードに対応するバックアップスクリプトを作成する
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%