ファイルが変更されているかどうかを確認する


10

Linux(現在ext4ファイルシステムを使用している)では、ファイルの内容読み取らずにファイルの内容が変更されているかどうかをすばやく確認するにはどうすればよいですか?

あるstatコマンドが推奨されるアプローチ?私は現在します

$ stat --format "%Y" hello.txt

その後、同じコマンドで同じ出力が得られるかどうかを確認できます。そうであれば、hello.txtは変更されていないと結論付けます。

私は、より確実にするために、より多くのパラメーターを投入したいと考えています。たとえば、ファイルサイズ、ファイル名などを追加すると、ファイルのさらに優れた「フィンガープリント」が提供されますか?

このトピックについて、TrueCryptがメタデータの変更を残さないようにしたためか、以前に使用したTrueCryptボリュームが常に増分バックアッププログラムによって無視されたことを思い出します。によって返されたすべてのデータを変更することは確かに可能だと思いstatます。そのため、ファイルの可能なすべての変更を取得することは保証できません。


md5sum filename
Ramesh 2014

md5sumまたは、あらゆる種類のチェックサムがファイルの内容を読み取ります。それは私の目的には遅すぎるので、私はそれをしたくありません。
DustByte、2014

ls -t変更時刻でディレクトリの内容をソートします。
ryekayo 2014

「変更されました」?すべてのファイルが変更されました。問題は、いつ変更されたかです。'find'を使用して、特定の範囲の変更時間を検索できます。
レイアンドリュース14

回答:


5

ファイルが通常の方法(アプリケーションでの編集、リビジョン管理システムからの新しいバージョンのチェックアウト、再構築など)で変更されたかどうかを検出する場合は、ファイルの変更時刻(mtime)が最後のチェック。それがstat -c %Y報告するものです。

変更時間はtouchコマンドで設定できます。ファイルの変更(の使用touch、アーカイブの抽出などを含む)を検出する場合は、そのiノード変更時刻(ctime)が前回のチェックから変更されているかどうかを確認します。それがstat -c %Z報告するものです。ctimeは、システム管理者(およびシステムクロックを変更するか、ファイルシステムをバイパスしてディスクに直接アクセスすることによる間接的な手段)以外では偽装できません。


おかげで、私はctimeが私が使うべきものであることを集めました。チェックサムが新しいファイルまたは変更されたファイルに対してのみ計算される自分のバックアップスクリプトでこれを使用することが目的であるという私の質問には従いませんでした。「わずかに」変更されたファイル(アクセス許可が変更されたなど)のチェックサムを計算する余裕があります。変更を決定するために、ファイルの内容を実際に見てできるだけ近くにいることを好みます。
DustByte

3

statコマンドの分解能は1秒のみです。したがって、ファイルが同じ1秒間に2回変更された場合、変更を見逃す可能性があります。ext4のような新しいファイルシステムは、ナノ秒単位のより高いタイムスタンプを提供しますが、いくつかの古いツールはまだ追いついていません。

また、他のプログラムが任意の変更時刻を設定することも可能です。これがtouchコマンドでどのように発生するかを確認できます。

これら2つの可能性のどちらかが心配な場合は、ファイルサイズを確認することも悪くありません。これは、変更されたファイルを探すときにrsyncが行うことです。


1

私は、より確実にするために、より多くのパラメーターを投入したいと考えています。

あなたが持っているのは正しい方法です。これが失敗する唯一の理由は、ファイルシステムが適切に更新されていない場合です。この場合、より深刻な問題が山ほど発生します。

もちろん、適切な知識と、パーティションにアクセスできるシステムへのrootアクセス権を持つユーザーが情報を変更して、ファイルが変更されていないかのように見せることができると思います。ただし、この場合は、必ずサイズなどを同じにする必要があります。


0

指紋をより細かくします。

MacOS / BSDとGNUの両方のバージョンで同じ出力を生成する小さなラッパー関数を作成statしました(gプレフィックス付きのHomebrewでインストールされたバージョンも検出します)。

init() {
  if command -v gstat > /dev/null; then
    # GNU coreutils with g prefix.
    statCmdArgs=("gstat" "--format=%n %s %b %u %g %i %h %Y %Z %W %o");
  elif ! stat --version > /dev/null 2> /dev/null; then
    # MacOS/BSD stat
    statCmdArgs=("stat" "-f" "%N %z %b %u %g %i %l %m %c %B %k");
  else
    # Assume GNU version without prefix.
    statCmdArgs=("stat" "--format=%n %s %b %u %g %i %h %Y %Z %W %o");
  fi;
}

getFileStatus() {
  "${statCmdArgs[@]}" "$1";
}

このinit関数はスクリプトの初期化中に一度getFileStatus呼び出され、検出のオーバーヘッドなしで繰り返し呼び出すことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.