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

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

ファイルとディレクトリの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()。すべての出生タイムスタンプにも同じです。

答え2

前述のように、類似項目を設定する唯一の方法はctimeカーネル内で行われ、ユーザー空間インターフェースは妥当な理由でatimeタイムスタンプを超える設定を許可しませんmtimectimeandを維持するにはandを使用して実行crtimeできますが、そのためには両側にすでにZFSが必要です。ZFS/sendZFS/receive

あなたが好きなことを繰り返します。

  • 既存のファイルシステムを別の場所にコピー

  • タイムスタンプは、後でこのコピーを実行したり他のプログラムを復元したりしても保持されますatimemtime

バックアップ/復元方法を実行してからタイムスタンプを復元する別のプログラムを実行するか、タイムスタンプを正しく復元するバックアップ/復元方法を実行することでこれを行うことができます。

starどちらの方法でも役立つ成熟したバックアップツールです。

バックアップおよび復元ファイルシステム(タイムスタンプを含む)を使用するには、starマニュアルページを確認してください。http://schilytools.sourceforge.net/man/man1/star.1.html

タイムスタンプを個別に保存および復元するには、バックアップを実行する前にタイムスタンプを保存する必要があります。これは、バックアップがatimeすべてのファイルの値に影響を与える可能性が高いためです。

  • ディレクトリツリー内のすべてのファイルのすべてのタイムスタンプを保存するには、次の手順を実行します。

    star -c -dump -meta f=timestamparchive.tar .
    
  • すべてのタイムスタンプを新しい場所に復元するには、次の手順を実行します。

    star -xU -meta f=timestamparchive.tar
    

最初のコマンドで生成されたアーカイブファイルは薬を使用します。ファイルあたり1.5KB。 2番目のコマンドは、すでにアーカイブに存在するすべてのファイルのすべてのタイムスタンプを復元しますが、ファイルの内容には影響しません。

注:私は「スター」の著者であり、39年間活動してきました。

答え3

"ls --full-time"コマンドはファイルの完全なタイムスタンプを提供します。このタイムスタンプは、「awk」を使用してフォーマットし、「date」を使用して現在の時刻名を付けたファイルに保存できます。

ls --full-time | awk '{print $6"\t"$7"\t"$9}' > timestamps.output.`date +%Y-%m-%d_%k:%M:%S.%N`

これは同様の結果をもたらします:

timestamps.output.2021-09-16_16:33:05.363928457:

2021-09-16  16:13:40.988062443  file1
2021-09-16  16:13:45.408053173  file2
2021-09-16  16:13:49.496044596  file3
2021-09-16  16:13:52.628038023  file4

これにより、時間の経過とともにファイルタイムスタンプの変更を追跡できます。もちろん、必要に応じてタイムスタンプ形式を指定できます。

「git」リポジトリを使用して、時間の経過とともにtimestamp.outputファイルの変更を追跡することもできます。

関連情報