Linux: アーカイブと圧縮 — tar / gzip / zipとデータバックアップ
データバックアップは運用の生命線です。Linuxでは、tar + gzipが最も普遍的なアーカイブソリューションで、rsyncが最も強力な差分同期ツールです。
📋 前提条件:まず以下を完了していること
- レッスン18:パッケージ管理
1. このレッスンで学ぶこと
- tar:アーカイブの作成と展開
- gzip vs bzip2 vs xz圧縮アルゴリズム
- zip:クロスプラットフォーム圧縮
- rsync:差分同期
- 自動バックアップ戦略
2. 「除外パラメータを忘れた」ストーリー
(1) 悩み:入れるべきでないものまでアーカイブに
小明はプロジェクトフォルダーを同僚に送る必要がありました — チームのルールでnode_modulesと.gitディレクトリは大きすぎて不要なため転送しないことになっていました。
(2) 1コマンドで完璧なアーカイブ
tar -czf project.tar.gz \
--exclude=node_modules \
--exclude=.git \
--exclude=__pycache__ \
project/
(3) 得られるもの:クリーンなパッケージ
小明の圧縮アーカイブは500MB(node_modules込み)から2MBに減りました。同僚は展開後すぐに使えました。
3. 知識ポイント
(1) tar — アーカイブツール
# 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 — クロスプラットフォーム圧縮
# 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 — 差分同期
# 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の利点:
- 差分転送(変更された部分のみ送信)
- 圧縮転送対応(
-z) - 転送中断からの再開
- SSHによる安全な転送
(5) ▶ サンプル:tarアーカイブと展開
# 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) ▶ サンプル:圧縮アルゴリズム比較
# 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クロスプラットフォーム配布
# 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バックアップ
# 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/
出力:
TEXTsending 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) ▶ サンプル:自動バックアップスクリプト
#!/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完全バックアップソリューション
#!/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 -czfはtar -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で前日のスナップショットを参照し、変更分のみ保存。
📖 まとめ
tar -czfでアーカイブ+圧縮、tar -xfで展開、tar -tfで内容確認--excludeで不要ファイルを除外- gzipが最速、xzが最高圧縮率、zipが最もクロスプラットフォーム対応
rsync -avzで差分同期、--deleteで送信先の余分なファイルを削除--link-destでハードリンクベースの差分スナップショットを作成
📝 練習問題
- 基本(難易度 ⭐):
~/projectsまたはテストディレクトリをbackup.tar.gzとしてアーカイブし、-vで過程を観察した後、tar -tfでアーカイブ内のファイルリストを確認する - 中級(難易度 ⭐⭐):
/tmp/testに展開してファイルの整合性を確認し、テストディレクトリを作成してzipで圧縮(サブディレクトリを除外)し、別の場所にunzipする - 上級(難易度 ⭐⭐⭐):rsyncでローカルディレクトリを
/tmp/backup/に同期し、差分転送を確認(ファイルを変更して再度同期、変更分のみ転送されたことを確認)した後、tar.gzフルバックアップとrsync差分バックアップ両モードに対応するバックアップスクリプトを作成する