タイムスタンプは、コピー元でも更新されます

ファイルのタイムスタンプについての理解、続きです。

ファイルの新規作成は、Access/Modify/Changeすべて同じ時間になりましたね。まあ、新規作成なので、そうなりますね。

takk@deb9:~/tmp$ ls
takk@deb9:~/tmp$ echo HELLO >a
takk@deb9:~/tmp$ stat a
  File: a
  Size: 6         	Blocks: 8          IO Block: 4096   通常ファイル
Device: 801h/2049d	Inode: 546991      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    takk)   Gid: ( 1000/    takk)
Access: 2018-06-14 20:43:16.936000000 +0900
Modify: 2018-06-14 20:43:16.936000000 +0900
Change: 2018-06-14 20:43:16.936000000 +0900
 Birth: -
takk@deb9:~/tmp$ 

さきほど作成したファイルを別のデータで上書きすると、

takk@deb9:~/tmp$ echo HELLO2 >a
takk@deb9:~/tmp$ stat a
  File: a
  Size: 7         	Blocks: 8          IO Block: 4096   通常ファイル
Device: 801h/2049d	Inode: 546991      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    takk)   Gid: ( 1000/    takk)
Access: 2018-06-14 20:43:16.936000000 +0900
Modify: 2018-06-14 20:44:02.688000000 +0900
Change: 2018-06-14 20:44:02.688000000 +0900
 Birth: -
takk@deb9:~/tmp$ 

Modify/Changeのみが更新されます。

ちょっと分かりづらいので、statコマンドの差分が分かるようにbash関数を組んでみます。

takk@deb9:~/tmp$ s(){
> stat $1 | diff - /tmp/stat.$1
> stat $1 >/tmp/stat.$1
> }
takk@deb9:~/tmp$ 

sという関数を作成しました。
前回sを実行した時のstatの差分を表示します。

ですので、1番最初は、このようにエラーがでますが。

takk@deb9:~/tmp$ s a
diff: /tmp/stat.a: そのようなファイルやディレクトリはありません
takk@deb9:~/tmp$ 

1回目以降は、差分がでます。当然今は差分がないので何も表示されません。

takk@deb9:~/tmp$ s a

では、ファイルを別のデータで更新してみます。

takk@deb9:~/tmp$ echo HELLO >a

sで確認。

takk@deb9:~/tmp$ s a
2c2
<   Size: 6         	Blocks: 8          IO Block: 4096   通常ファイル
---
>   Size: 7         	Blocks: 8          IO Block: 4096   通常ファイル
6,7c6,7
< Modify: 2018-06-14 20:46:44.552000000 +0900
< Change: 2018-06-14 20:46:44.552000000 +0900
---
> Modify: 2018-06-14 20:44:02.688000000 +0900
> Change: 2018-06-14 20:44:02.688000000 +0900
takk@deb9:~/tmp$ 

HELLO2がHELLOになったので、Sizeが更新されたのと、
ファイルの内容が更新されたので、Modify/Changeが更新されました。

次はファイルのリード。catでファイルの中身を閲覧した後に、sコマンド。

takk@deb9:~/tmp$ cat a
HELLO
takk@deb9:~/tmp$ s a
5c5
< Access: 2018-06-14 20:47:19.856000000 +0900
---
> Access: 2018-06-14 20:43:16.936000000 +0900
takk@deb9:~/tmp$ 

Accessのみ更新されました。

次は、ファイルの追記。元々あるデータを更新するのではなく、追記です。
どうなるでしょうか。

takk@deb9:~/tmp$ echo HELLO2 >>a
takk@deb9:~/tmp$ s a
2c2
<   Size: 13        	Blocks: 8          IO Block: 4096   通常ファイル
---
>   Size: 6         	Blocks: 8          IO Block: 4096   通常ファイル
6,7c6,7
< Modify: 2018-06-14 20:47:55.256000000 +0900
< Change: 2018-06-14 20:47:55.256000000 +0900
---
> Modify: 2018-06-14 20:46:44.552000000 +0900
> Change: 2018-06-14 20:46:44.552000000 +0900
takk@deb9:~/tmp$ 

Sizeと、Modify/Changeが更新されました。
ファイルのデータが更新されたら、とにかくModify/Changeされるんですね。

次はファイルコピー。
コピー元は、データが読み込みされるわけなので、Accessが更新されて、
コピー先は、新規ファイルなので、Access/Modify/Changeが新規時間ですよね。

takk@deb9:~/tmp$ cp a b
takk@deb9:~/tmp$ s a
5c5
< Access: 2018-06-14 20:48:37.280000000 +0900
---
> Access: 2018-06-14 20:47:19.856000000 +0900
takk@deb9:~/tmp$ 

コピー元は、正解。Access日時だけ更新。

コピー先は、

takk@deb9:~/tmp$ s b
diff: /tmp/stat.b: そのようなファイルやディレクトリはありません

oops。忘れてました。新規ファイルなので前回差分が取れません。
仕方ないので、statを実行します。

takk@deb9:~/tmp$ stat b
  File: b
  Size: 13        	Blocks: 8          IO Block: 4096   通常ファイル
Device: 801h/2049d	Inode: 546994      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    takk)   Gid: ( 1000/    takk)
Access: 2018-06-14 20:48:37.280000000 +0900
Modify: 2018-06-14 20:48:37.280000000 +0900
Change: 2018-06-14 20:48:37.280000000 +0900
 Birth: -
takk@deb9:~/tmp$ 

正解。Access/Modify/Changeが新規日時、コピー元ファイルのAccessと同じ時間ですね。

次は、ファイル名の変更です。

takk@deb9:~/tmp$ mv b c
takk@deb9:~/tmp$ stat c
  File: c
  Size: 13        	Blocks: 8          IO Block: 4096   通常ファイル
Device: 801h/2049d	Inode: 546994      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    takk)   Gid: ( 1000/    takk)
Access: 2018-06-14 20:48:37.280000000 +0900
Modify: 2018-06-14 20:48:37.280000000 +0900
Change: 2018-06-14 20:51:03.168000000 +0900
 Birth: -
takk@deb9:~/tmp$ 

Changeだけの更新ですね。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA