Linux

cp -p コマンドで維持されるタイムスタンプとは?

投稿日:

1. ファイルとディレクトリが持つ「時刻情報」

Linux でのファイルとディレクトリは、通常以下の4つの時刻情報を持っています。

Access 最終アクセス時刻
Modify 最終修正時刻(最後にデータを修正した時刻)
Change 最終状態変更時刻(最後にメタデータを修正した時刻)
Birth 作成時刻

2. cp -p コマンドで維持されるタイムスタンプとは?

cp コマンドはファイルやディレクトリをコピーするコマンドですが、-p オプションを付けると、「アクセス許可情報」「所有者と所有グループ」「タイムスタンプ」が保持されてコピーされます。

この「タイムスタンプ」とは、1 に書いた「Access」「Modify」「Change」「Birth」のうちのどれを指すのでしょうか?

本記事で言いたいのはこれだけなのですが、結論を言ってしまうと「Access」と「Modify」です。この2つは元のファイルの値が保持されます。

3. 実験

foo.txt というファイルで実験してみます。

まず、statコマンドを実行し、このファイルが持っている各時刻情報を表示します。

$ stat foo.txt
  File: foo.txt
  Size: 12070           Blocks: 24         IO Block: 4096   通常ファイル
Device: fd02h/64770d    Inode: 527408      Links: 1
Access: (0600/-rw-------)  Uid: ( 1000/    taro)   Gid: ( 1000/    taro)
Access: 2020-06-24 13:01:27.393000000 +0900
Modify: 2020-06-24 13:00:25.543000000 +0900
Change: 2021-02-18 00:06:55.331000000 +0900
 Birth: 2020-06-24 13:00:25.542000000 +0900

次にこのファイルをコピーします。

$ cp -p foo.txt foo1.txt

今度は、コピーして作成されたファイルに対して statコマンドを実行し、各時刻情報を表示します。

$ stat foo1.txt
  File: foo1.txt
  Size: 12070           Blocks: 24         IO Block: 4096   通常ファイル
Device: fd02h/64770d    Inode: 532513      Links: 1
Access: (0600/-rw-------)  Uid: ( 1000/    taro)   Gid: ( 1000/    taro)
Access: 2020-06-24 13:01:27.393000000 +0900
Modify: 2020-06-24 13:00:25.543000000 +0900
Change: 2022-06-20 19:19:07.931000000 +0900
 Birth: 2022-06-20 19:19:07.930000000 +0900

Change」と「Birth」は更新されてしまいました!

4. 補足

GNU Coreutils: 11.1 cp: ファイルやディレクトリをコピーする にはちゃんと書いてあります。

‘timestamps’

最終アクセス日時 (last access time) と最終更新日時 (last modification time) を、可能ならば、維持する。古いシステムでは、対象となるファイルがシンボリックリンクの場合、 そうした属性を維持することができない。 それに対して、最近のシステムでは、たいていのものが utimensat 関数を用意しているので、シンボリックリンクの場合でも、日時関係の属性維持が可能である。

GNU Coreutils: 11.1 cp: ファイルやディレクトリをコピーする

5. 参考

📂-Linux

執筆者:labo


comment

メールアドレスが公開されることはありません。

関連記事

Linux

【Linux】 CentOS のマニュアル

CentOS は、RHEL (Red Hat Enterprise Linux)のソースコードから商標や商用パッケージ等を除去してリビルドした RHELクローンです。 マニュアルを見る場合は、RHEL …

Linux

ラベル行のある複数ファイルを1ファイルにマージするコマンド

ラベル行のある複数ファイルをマージするコマンドを紹介します。

Linux

コマンドに対してデフォルトで指定されているオプションを調べる

Linux などの UNIX系OS環境では、コマンドを入力して実行する機会が多いと思いますが、それぞれの環境によって、いくつかのコマンドオプションがデフォルトで指定されている場合があります。 ※ ログ …

Linux

ssh-agent の代わりに gpg-agent を使う手順

ssh-agent の代わりに gpg-agent を使う手順について説明します。

CentOS

CentOS 6 での yum update エラーに対応しました

問題 先日、CentOS 6.9 で yum update したところ、以下のエラーが発生しました。 https://ca.mirror.babylon.network/remi/enterprise …