
特定の日付以降に変更されたファイル (所有権、権限などの変更を含む) を取得し、バックアップから単に復元されたファイルは除外するには、どの tar コマンドを使用すればよいですか?
一方、復元後にすべてのファイルを調べて、復元の一環としてそれぞれのステータス変更時刻を変更する方が望ましいでしょうか?
私は、定期的な簡易バックアップのために、次のようなコマンドを使用して、特定の日付以降に最近変更されたすべてのファイルを tar で圧縮しています。
$ SINCE=20190501
$ tar cf - --after-date="${SINCE} 00:00:00" . | tar tvf -
これは実際のコマンドではありませんが、私が言おうとしていることを表しています。このコマンドは、出力を tar ファイルに送信する場合に、tar ファイルに格納されるファイルのリストを単にダンプするだけです。
これまで、ハード ドライブを交換してバックアップからすべてのファイルを復元するまで、このコマンドは正常に動作していると思っていました。 の出力を見るとstat
、変更日はバックアップからすべてのファイルを復元した日付であるようです。そのため、上記の tar コマンドではすべてのファイルが選択されています。
$ stat restore_file.txt
...
Modify: 2019-04-01 23:52:12.000000000 -0500
Change: 2019-05-25 01:52:10.737688040 -0500
それでも--newer-mtime
役に立たないようです:
$ tar cf - --newer-mtime="${SINCE}" . | tar tvf -
アップデート:以下のことも試してみましたが、それでも必要な数よりも多くのファイルが選択されたため、何も役に立たなかったようです。
$ SINCE=201905010000
$ touch -t "${SINCE}" /tmp/timestamp
$ stat /tmp/timestamp
Access: 2019-05-01 00:00:00.000000000 -0500
Modify: 2019-05-01 00:00:00.000000000 -0500
Change: 2019-06-30 18:29:19.277267874 -0500
$ tar cf - --after-date /tmp/timestamp . | tar tvf -
答え1
ディレクトリをフィルタリングすることにより:
$ tar cf - --after-date="${SINCE} 00:00:00" . | tar tvf - | grep -v '^d'
取得したいファイルは確かに取得されているが、それ以上のことは何も行われていないことがわかります。
何らかの理由で、tar はタイムスタンプに関係なくすべてのディレクトリを取得しますが、私はそれで問題ないと思います。そのため、上記のコマンドはほとんどの場合問題なく機能し、バックアップを復元するまでは問題はありませんでした。
さて、復元に関しては、復元された各ファイルに変更属性が設定されたと述べましたが、--after-date
次のバックアップではすべてのファイルが取得されたため、これは役に立ちませんでした。
これを回避するために、復元後初めて、次の方法を使用するように切り替えました--newer-mtime
:
$ tar cf - --newer-mtime="${SINCE} 00:00:00" . | tar tvf -
--after-date
これにより、復元以降のすべての新しいファイルを取得できるようになり、次のバックアップから元のファイルを再度使用する予定です。
これには、以下で説明するように、1 つの欠点があります。ファイルを復元した時点と最初のバックアップの間に権限または所有権の変更があった場合、その変更は検出されず、同じファイルの権限/所有権が再度変更されない限り、おそらく検出されることはないでしょう。その場合、更新はその時点のみで行われ、その時点までのバックアップはすべて間違った権限/所有権で復元されます。
のGNU tar マニュアル次のように述べている。
ファイルの内容が変更された場合、またはファイルの所有者、権限などが変更された場合、ファイルのステータスは変更されたと見なされます。
「など」が何を意味するのかよく分かりませんが、それも見逃しています。
ここでバックアップしている内容を考えると、この点については心配していないので、今回は問題ありません。ただし、この点が気になる場合は、増分バックアップを破棄して、新しい完全バックアップから最初からやり直すか、--newer-mtime
復元直後に上記の手順に従って 1 つの増分バックアップで復元プロセスを終了することができます。後者は、復元されたファイルが使用される前に実行されるため、 に切り替える前に適切な増分バックアップを取得できます--after-date
。