Linux(現在のext4ファイルシステムを使用)でファイルの内容が変更されたかどうかをすばやく確認する方法いいえ読んでみましたか?
このstat
コマンドは推奨されるアプローチですか?私は現在
$ stat --format "%Y" hello.txt
後で、同じコマンドが同じ出力を生成することを確認できます。もしそうなら、hello.txtは変更されていないと結論付けます。
私の考えは、人々がより確実にするためにより多くのパラメータを入力したいということです。たとえば、ファイルサイズ、ファイル名などを追加すると、ファイルのより良い「指紋」が提供されますか?
このトピックについては、私が一度持っていたTrueCryptボリュームが増分バックアップ手順で常に無視されたことを覚えています。それはおそらく、TrueCryptがメタデータの変更を防ぐことを保証したからです。返されたすべてのデータが変更される可能性があるという事実stat
なので、ファイルの可能なすべての変更は保証されませんか?
答え1
ファイルが一般的な方法(一部のアプリケーションで編集、リビジョン管理システムで新しいバージョンを確認、再構築など)で変更されたかどうかを検出するには、変更時間(mtime)が変更されていることを確認してください。最後に確認してからです。それがstat -c %Y
報告されているのです。
修正時間はコマンドで設定できますtouch
。ファイルがどのような方法(使用法touch
、アーカイブ抽出などを含む)に変更されたかを検出するには、対応するinode変更時間(時間)が最後の確認以降に変更されました。それがstat -c %Z
報告されているのです。 ctimeは、システム管理者を除いてなりすましできません。 (そのような場合でも、システムクロックを変更したり、ファイルシステムをバイパスしてディスクに直接アクセスするなど、間接的な方法でのみ可能です。)
答え2
statコマンドの分解能はわずか1秒です。したがって、同じ秒でファイルが2回変更された場合は、修正を見逃す可能性があります。 ext4などの最新のファイルシステムは、ナノ秒範囲のより高い解像度のタイムスタンプを提供しますが、いくつかの古いツールはまだ追いついていません。
また、他のプログラムでは、任意の修正時間を設定できます。 touchコマンドを使用すると、これがどのように発生するかを確認できます。
これらの可能性のいずれかが気になる場合は、ファイルサイズを確認するのも悪くありません。これは、変更されたファイルが見つかったときにrsyncが実行するアクションです。
答え3
私の考えは、人々がより確実にするためにより多くのパラメータを入力したいということです。
あなたが持っているのは正しいアプローチです。失敗した唯一の理由は、ファイルシステムが正しく更新されなかったためです。この場合、より深刻な問題が多く発生します。
もちろん、私はパーティションにアクセスできるシステムに関する正しい知識とルートアクセス権を持つ誰かがそれを可能にするために情報を変更できると仮定します。バラよりファイルが変更されていないようです。ただし、この場合、寸法なども同様に行う必要があります。
答え4
指紋をもう少し詳しく描いてみました。
私はMacOS / BSDとGNUバージョンの両方に対して同じ出力を生成する小さなラッパー関数を作りましたstat
(また、プレフィックス付きのHomebrewインストールバージョンも検出しますg
)。
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
インスツルメンテーションのオーバーヘッドなしで繰り返し呼び出すことができます。