読者です 読者をやめる 読者になる 読者になる

harry’s memorandum

おれおれメモ

ワンライナーでtarバックアップ

linux unix

Sourceforge.jp Magazineで連載?中のOne-Linerです。
忘れないように自分が昔から使っているのと新しく覚えたものを備忘録。
http://sourceforge.jp/magazine/09/01/14/0134202

Tarアーカイブとバックアップ

  • 普通のtarとgzip
$ tar cvf dir.tar ./dir
$ gzip -1 dir.tar
  • GNUtarでtgz
$ tar cvzf dir.tgz ./dir
  • GNUtarがない場合をパイプを使って。option '-[1-9]' は 圧縮時間を速くするか圧縮率を上げるか。
$ tar cf - ./dir | gzip -1 > dir.tar.gz
  • もちろんgzipではなく高圧縮のbzip2でもOK.
$ tar cf - ./dir | bzip2 -9 > dir.tar.bz2
  • もちろんリダイレクトではなくddに変更するのもあり。*1
$ tar czf - ./dir | dd of=dir.tgz
  • GNUtarだと'-C'でアーカイブ展開先を指定できる。
$ tar xvzf dir.tar -C ./path/to/hoge
  • tarでバルクコピー。tarはメタを保持するので便利。(cpでコピーするとシンボリックリンクとかあるとやべーことになるかもしれないし)
$ tar cf - ./test_src | (cd ./path/to/test_dest; tar xvf - )
  • GNUtarでバルクコピーなら'-C'でコピー先を指定できる。
$ tar cf - ./test_src | tar xvf - -C ./test_dest/
  • tarのバルクコピーはsshやrshを使って別マシンへ送りつけることも可能。
$ tar cf - ./test_src | ssh user@server.com "(cd /path/to/test_dest; tar xvf - )"
  • リモートサーバへのtarバルクコピーでもGNUtarなら'-C'オプションで展開先指定できる。
$ tar cf - ./test_src | ssh user@server.com tar xvf - -C /path/to/test_dest
  • サイズが大きい場合はGNUtarで圧縮してリモートサーバへバルクコピー。
$ tar czf - ./test_src | ssh user@server.com "(cd /path/to/test_dest; tar xvzf - )"
  • そもそもリモートサーバには圧縮アーカイブでバックアップにしたい。
$ tar czf - ./test_src | ssh user@server.com "cat - > /path/to/test_src.tgz"
  • 古いUNIX機にはGNUtarなんかねーんだよ、という状態でもリモートサーバに圧縮アーカイブでバックアップ。
$ tar cf - ./test_src | ssh user@server.com "gzip -1 > /path/to/test_src.tar.gz"
  • サイズが大きいからできるだけ高速になるようにddでおまじない。(きっと気休めだけど)
$ tar czf - ./test_src | ssh user@server.com dd bs=4096 of=/path/to/test_src.tar.gz

もしかしたら役に立つかもしれない小技

  • リモートサーバにテスト用の圧縮できないゴミファイル作成。*2
$ cat /dev/urandom | rsh -l user server.com "cat - > junkfile.txt"
  • mysqldumpしたデータをリモートサーバに日付付きでバックアップ
$ mysqldump -u root -x --all-databases  | ssh user@server.com "gzip -1 > /path/to/backup.`date +%Y%m%d`.gz"
  • リダイレクトうざいって人はddに変更。(ローカル/リモート)圧縮するところは気分で。
$ mysqldump -u root -x --all-databases | gzip -1 | ssh user@server.com dd of=/path/to/backup.`date +%Y%m%d`.gz
  • ログインに失敗(もしくはブルートフォースアタック)しているログをメールで送るんだけど、理解不能な社内ルールのためにメール送信できるサーバが限定されている場合。
$ awk '{ if($8=="failure;") print }' secure | ssh user@server.com mail -s 'failure_check' hoge@example.co.jp
  • 暇なのでパイプたくさん繋げてみる
$ tar cf - /path/to/src  | gzip -c  | cat - | gzip -cd | tar xvf - -C /path/to/dest

*1:標準入出力はリダイレクトでもddでも好みの方法ってことで

*2:リモートサーバ先にsshもとい/dev/urandomがない場合という超限定しか使えん