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ユーザー以外で実行した場合は所有者を変更できず、実行ユーザーのままになる。パーミッションと更新日時は一般ユーザーでも保持される。
\第一線のプログラマーの行動原理を学べる!/
