やりたかったこと

サーバー上のファイルをまとめてバックアップしたり、ログを圧縮して容量を節約したかった。 tarとzipはどちらもよく使うのに、オプションが多くていつも調べ直していた。

tarコマンドの基本

アーカイブを作成する(圧縮なし)

tar -cvf archive.tar ./mydir
  • -c : 作成(create)
  • -v : 詳細表示(verbose)
  • -f : ファイル名を指定

gzip圧縮で作成する(.tar.gz)

tar -czvf archive.tar.gz ./mydir

bzip2圧縮で作成する(.tar.bz2)

tar -cjvf archive.tar.bz2 ./mydir

tarで解凍する

# .tar を展開
tar -xvf archive.tar

# .tar.gz を展開
tar -xzvf archive.tar.gz

# .tar.bz2 を展開
tar -xjvf archive.tar.bz2

# 展開先ディレクトリを指定する
tar -xzvf archive.tar.gz -C /tmp/

tarの中身を確認する(展開せずに)

tar -tzvf archive.tar.gz

zipコマンドの基本

# ファイルを圧縮
zip archive.zip file1.txt file2.txt

# ディレクトリごと圧縮(再帰的に)
zip -r archive.zip ./mydir

# 圧縮レベルを指定(0〜9、デフォルトは6)
zip -r -9 archive.zip ./mydir

unzipで解凍する

# カレントディレクトリに解凍
unzip archive.zip

# 解凍先を指定する
unzip archive.zip -d /tmp/output

# 中身を確認する(解凍せずに)
unzip -l archive.zip

よく使うパターン

ログを日付付きでアーカイブする

tar -czvf "logs-$(date +%Y%m%d).tar.gz" /var/log/nginx/

特定のファイルを除外して圧縮する

tar -czvf archive.tar.gz ./mydir --exclude='*.log' --exclude='node_modules'

圧縮率を確認する

ls -lh archive.tar.gz
du -sh ./mydir

ハマったポイント

  • tar -xzvff オプションは必ず最後にする(-fの直後にファイル名が来る)
  • zip -r-r を忘れるとディレクトリの中身が入らない
  • .tar.gz.tgz は同じ形式なのでどちらのオプションでも展開できる
  • Linuxサーバーに unzip が入っていないことがある(apt install unzip で入れる)
  • tar でパスを指定する際、先頭の / があると絶対パスで展開されて危険なことがある(-P オプションで解除可能)

定期的なバックアップを自動化したい場合はLinuxでCronジョブを設定して定期実行する方法と組み合わせてtarコマンドをcronで実行するのが定番だ。

関連記事

おすすめのVPS/ドメイン/スクール

VPSを使って本番環境を構築するなら、以下のサービスがおすすめです。