ファイル/ディレクトリのバックアップと復元のためのタイムスタンプ?

ファイル/ディレクトリのバックアップと復元のためのタイムスタンプ?

ファイルとディレクトリのa / c / mタイムスタンプをバックアップし、必要に応じて復元できるようにする必要があります。

バックアップコマンドの例は次のとおりです。

$ timestamp backup --all-stamps --incl-dir-stamps --recursive out.stampbak file.bin /dir/with/files/

回復は次のとおりです。

$ timestamp restore --all-stamps out.stampbak

私が望む結果を得るためにそのようなコマンドが存在しますか?ほとんどのファイルシステムはナノ秒単位で停止していると思いますが、ナノ秒精度やその他のより細かい精度が好まれます。バックアップ/復元にはBSDおよびGNU / Linuxシステムにタイムスタンプが必要なため、POSIX準拠も重要です。


編集する:いくつかのことを明確にするために、私がリストしたファイルシステムはほとんどファイルを保持します。現在ついにプライマリZFSサーバーに移動できるまでです。これが私たちがタイムスタンプを維持する可能性を考慮に入れる理由です。今後データをZFSに移行します。転送中にスタンプが変更された場合(HTTP、FTP、SMBなどのさまざまな方法を使用)、元に戻すことができることを確認したいと思います。転送後もタイムスタンプを小さなバックアップに保つことが有益であるため、ファイルがZFSに保存されるたびにタイムスタンプをサポート/回復するという問題だけが残ります。バックアップ時に権限とグループ情報を省略できます。

バックアップタイムスタンプに使用されるオペレーティングシステムには、macOS Mojave 10.14.6、Ubuntu Server 18.04.5 LTS、Debian 10.2/7.8、FreeBSD 12.2、およびCentOS 8が含まれます。回復は主にFreeBSD(ZFSサーバーホスト)で行われ、他の場所では必要ないようです。役に立つ場合は、NTFSパーティションにファイルを含む複数のドライブがあります。これらのタイムスタンプを正しくバックアップするには、小さなWindowsインスタンスを実行する必要がありますか?

また、ほとんどのファイルシステムはatime、ctime、mtimeを使用し、他のファイルシステムは使用しないという印象を受けました(結局、ファイルシステムによって異なると思います)。私の目標は、可能であればすべて保存して復元することです。

ツールはどのプラットフォームでも使用できるため、POSIX準拠について言及しました。前の説明が不正確であるか不適切である場合は謝罪します。私はctime =生成/生成時間だと思いましたが、今は変更時間であることがわかります。

維持する必要がある最も重要なタイムスタンプは、生成/生成時間と修正時間です。アクセス時間も良く、時間の変更はそれほど重要ではありませんが、それでも役に立ちます。もう一度間違いをお詫び申し上げます。まだ学んでいます。


編集2:~からこの記事私はこれを学びました:

  • ファイル生成タイムスタンプは、ほとんどのファイルシステムでは保存されません。これは、「特定の日に生成されたすべてのファイルを表示する」などのコマンドを実行できないことを意味します。つまり、通常はctimeとmtimeで同じ結果を推論できます(一致する場合 - これはおそらくファイルの作成時間を意味します)。

  • 新しいファイルまたはディレクトリを作成するときは、通常、3つの時間(atime、ctime、およびmtime)がすべて現在時刻をキャプチャするように設定されます。

ターゲットファイルシステムは、ファイル/ディレクトリのタイムスタンプが復元されるZFSになるので、タイムスタンプを保存するファイルシステムが作成時間を保存しない場合に備えて、少なくともatime、ctime、mtimeを保存することをお勧めします。

ベストアンサー1

GNU findとPerlを使用できる場合は、それを使用して何かを組み合わせることができます。-printftoアクションはfindタイムスタンプを印刷でき、Perlにはutimeタイムスタンプを変更する機能があります。あるいは、2つ、1つは組み込み、もう1つはTime :: HiResモジュールにあり、後者は1秒未満の精度をサポートします。

テスト用のいくつかのファイル:

$ find . -printf '%A@ %T@ %p\n'
1631866504.4180281370 1631866763.5380257720 .
1631866763.5380257720 1631866768.2101700800 ./dir
1631866768.2101700800 1631866768.2101700800 ./dir/bar.txt
1631866760.2619245850 1631866760.2619245850 ./foo.txt

タイムスタンプをファイルに保存する:

$ find . -printf '%A@ %T@ %p\0' > ../times

タイムスタンプを削除してみましょう。

$ touch -d 1999-01-01 **/*
$ find . -printf '%A@ %T@ %p\n'
1631866771.6022748540 1631866763.5380257720 .
915141600.0000000000 915141600.0000000000 ./dir
915141600.0000000000 915141600.0000000000 ./dir/bar.txt
915141600.0000000000 915141600.0000000000 ./foo.txt

ファイルから再読み込みします。

$ perl -MTime::HiRes=utime -0 -ne 'chomp; my ($atime, $mtime, $file) = split(/ /, $_, 3); utime $atime, $mtime, $file;'    < ../times
1631866771.6022748950 1631866763.5380258560 .
1631866771.6022748950 1631866768.2101700310 ./dir
1631866768.2101700310 1631866768.2101700310 ./dir/bar.txt
1631866760.2619245050 1631866760.2619245050 ./foo.txt

utimeファイルには、各値セットに対するPerlスニペット呼び出しとともに、atime、mtime、およびファイル名を含むNUL終了フィールドのみが含まれます。

NULをターミネータとして使用すると、任意のファイル名を処理できるはずですが、ここではなく出力を\n印刷\0するために使用していることに注意してください。このPerlフラグメントは改行文字ではなくNULを期待しているため、このPerlコードフラグメントでは機能しません。

また、私が知っている限り、utime()/ setはとにかく使用できないので、ctimeを完全に無視しましたutimensat()。すべての出生タイムスタンプにも同じです。

おすすめ記事