mvコマンドを使用してファイル名を変更すると、inodeの「変更された」日付と時刻が変更されるのはなぜですか?

mvコマンドを使用してファイル名を変更すると、inodeの「変更された」日付と時刻が変更されるのはなぜですか?

hello.c ファイルの名前は hi.c に変更されます。 statコマンドの出力に示すように、[change]タイムスタンプが変更されました。通常、ファイルのinodeが変更されると、対応するiノードも変更されます。 mvコマンドで名前を変更すると、inodeの内容が変更され、実際に変更されるプロパティは何ですか?

xyz@linuxPC:~/Documents$ stat hello.c
 File: ‘hello.c’
 Size: 568          Blocks: 8          IO Block: 4096   regular file
Device: 809h/2057d  Inode: 261889      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/ xyz)   Gid: ( 1000/ xyz)
Access: 2015-04-22 19:54:34.889330399 +0530
Modify: 2015-04-22 19:54:34.241330427 +0530
Change: 2015-06-21 15:46:45.365465523 +0530
Birth: -
xyz@linuxPC:~/Documents$ mv hello.c hi.c
xyz@linuxPC:~/Documents$ stat hi.c 
 File: ‘hi.c’
 Size: 568          Blocks: 8          IO Block: 4096   regular file
Device: 809h/2057d  Inode: 261889      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/ xyz)   Gid: ( 1000/ xyz)
Access: 2015-04-22 19:54:34.889330399 +0530
Modify: 2015-04-22 19:54:34.241330427 +0530
Change: 2015-06-21 15:48:23.361469822 +0530
Birth: -

答え1

私も興味があり、ちょっと探してみました。最初は、ノードが2つのリンクを取得した後、元のリンクが削除され、ctimeが意図的な作業ではなく、事故に近い一種の副作用であることがわかりました。

誰かがわからない場合、ファイルは次のものを含むinodeとして表示されます。何もない名前についてです。 inode はハードリンクカウンタによって得られた名前の数を「知っています」が、その名前が何であるか、その名前がどのディレクトリにあるかについての手がかりはありません。

それからPOSIX(http://pubs.opengroup.org/onlinepubs/009695399/functions/rename.html):

いくつかの実装では、名前が変更されたファイルを更新するためにst_ctimeフィールドを表示し、一部はそうではありません。 st_ctimeフィールドを使用するアプリケーションは、両方の動作を許可するように設計されていない場合は、名前が変更されたファイルとは異なる動作をする可能性があります。

および実装例(http://lxr.free-electrons.com/source/fs/xfs/xfs_inode.c#L2985):

/*
 * We always want to hit the ctime on the source inode.
 *
 * This isn't strictly required by the standards since the source
 * inode isn't really being changed, but old unix file systems did
 * it and some incremental backup programs won't work without it.
 */
xfs_trans_ichgtime(tp, src_ip, XFS_ICHGTIME_CHG);

それはすべてです。

答え2

久しぶりに注文

勢い古い道 新しい道

内部的には次mv.cのように実装されます。

協会(古い道新しい道);
切断新しい道);

今システムコールがあります。

名前変更(古い道新しい道);

しかし、明らかにカーネル内ではまだ同じ方法で動作します。これは私の推測ですが、失敗モードの1つ名前変更(2)はい

EMLINK

    古い道すでに最大リンク数に達しているか...

そして、あなたが報告した実験データ(そして私が自分のシステムで確認したデータ)に基づいています。

だから...

いつ古い道に接続されています新しい道、inodeのリンク数が1増加します。いつ古い道接続が解除されると、inodeのリンク数が1ずつ減少します。したがって、インデックスノードが変更されます(即時以前の状態に戻っても)。


PS 興味深いことに、POSIXドキュメントにはEMLINKが可能なエラー戻りコードとしてリストされていますが、いいえファイル間の名前変更の場合。

答え3

ファイルのinodeには何も変更されていないため、理想的には名前を変更するときにctimeを変更しないでください。ただし、これはファイルの内容が変更されたことをバックアッププログラムに通知するためにファイルを強調表示する便利な方法です。したがって、バックアップ手順では、「ctimeが最後のバックアップ時間よりも最新です」を確認するだけで十分です。みんな最後のバックアップ以降に変更されたすべてのファイル。

関連情報