動かざることバグの如し

近づきたいよ 君の理想に

Linuxでパーミッション情報やシンボリックリンクを維持したままコピーしたい

特定のディレクトリをバックアップしたいとき、cp -r target destすればもちろんコピーできるが、とっても大切なデータの場合慎重になる。

というのもcpコマンドではパーミッションまで保持してくれないからである。

-aオプションをつけると属性を引き継いだままコピーできるが、うまくいかないケースも稀にある。

そんなときはcpではなくtarを使うと吉

tar cfp - target_dir | tar xfp - -C /tmp/

オプションの意味だが、

  • c createの意味 作成モード
  • f fileの意味 デフォルトだとテープとかいう謎なのでファイルモードに -p permissionの意味 今回のキモオプション パーミッションを保持する

  • x 解凍モード

  • f 同じくファイルモード
  • p 同じくパーミッションを保持
  • C 指定したディレクトリへ解凍

例えば以下のようなworkディレクトリを/root/workへまるごとバックアップしたい時がある

# ll work/
total 4
-rw-rw-r-- 1 nginx   nginx      0 Aug 30 14:36 aaa
drwxrwxr-x 2 vagrant vagrant 4096 Aug 30 14:36 bbb

# ll work/bbb/
total 0
-rw-rw-r-- 1 root root 0 Aug 30 14:36 cccc

tarで実行

tar cfp - work | tar xfp - -C /root

ちゃんとパーミッションが引き継がれている。

# ll /root/work/
total 4
-rw-rw-r-- 1 nginx   nginx      0 Aug 30 14:36 aaa
drwxrwxr-x 2 vagrant vagrant 4096 Aug 30 14:36 bbb

# ll /root/work/bbb/
total 0
-rw-rw-r-- 1 root root 0 Aug 30 14:36 cccc

参考リンク