tar 指令用於取得定期備份的文件

tar 指令用於取得定期備份的文件

我應該使用什麼 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從下一次備份開始再次使用原始文件。

這有一個缺點,如下所述:如果在我恢復文件和第一次備份之間有任何權限或所有權更改,我不會選擇它,而且我可能永遠不會選擇,除非這些相同的文件的權限/所有權發生變更再次,然後我只會在那時獲得更新,並且直到那時我的所有備份都會以錯誤的權限/所有權進行還原。

GNU tar 手冊陳述如下:

如果文件內容已被修改,或其擁有者、權限等已更改,則文件的狀態被視為已更改。

我不清楚「等等」是什麼意思,但我也錯過了這一點。

考慮到我在這裡備份的內容,我並不擔心這一點,所以這次我對此感到滿意;但是,在我確實關心的情況下,我可以丟棄增量備份並從全新的完整備份開始,或者我可以按照上述步驟使用--newer-mtime恢復後立即使用一個增量備份來結束恢復過程。後者會發生在人們開始使用恢復的檔案之前,所以我在切換回--after-date.

相關內容