cp コマンドでパーミッションとタイムスタンプを保持したい

cpコマンドでファイルをコピーすると、コピー先のパーミッションはumaskの影響を受け、更新日時はコピーした時刻になる。バックアップやデプロイでは、元のファイルの属性をそのまま維持したい場合がある。

-pオプションを使用すると、コピー元のパーミッション・所有者・タイムスタンプを保持したままコピーできる。

-p を付けない場合

-pを付けずにコピーすると、パーミッションはコピー元の値からumaskを差し引いた値になり、更新日時はコピーした時刻になる。

$ umask
0022

$ ls -l original.txt
-rw-rw-r-- 1 root root 6 Jan  1  2020 original.txt

$ cp original.txt copy_normal.txt
$ ls -l copy_normal.txt
-rw-r--r-- 1 root root 6 Jul  5 00:36 copy_normal.txt

umaskが0022のため、コピー元のグループ書き込み権限が落とされ、パーミッションが664から644に変わっている。更新日時もコピーした時刻に変わっている。

cp -p でパーミッションとタイムスタンプを保持する

-pオプションを付けると、umaskの影響を受けずにコピー元のパーミッションと更新日時がそのままコピー先に引き継がれる。

$ cp -p original.txt copy_preserved.txt
$ ls -l copy_preserved.txt
-rw-rw-r-- 1 root root 6 Jan  1  2020 copy_preserved.txt

パーミッションが664のまま、更新日時も元のファイルと同じJan 1 2020のままコピーされている。

用途

-pは以下のような場面で役立つ。

  • バックアップ取得時に元ファイルの属性を維持したい場合
  • デプロイでファイルを配置する際、権限設定を引き継ぎたい場合
  • ファイルの更新日時を基準に処理するスクリプトで、コピーによって更新日時が変わると困る場合

所有者(owner)について

-pは所有者(owner)の保持も試みるが、一般ユーザーで別の所有者を設定するには権限が必要なため、rootユーザー以外で実行した場合は所有者を変更できず、実行ユーザーのままになる。パーミッションと更新日時は一般ユーザーでも保持される。