我需要从 Time Machine 备份中逐步提取特定目录的所有数据,因此:
- 它适合目标驱动器大小
- 它没有硬链接,因为目标卷文件系统是 exFAT
- 无需使用 Crapple 的过时软件,就可以轻松地从 Windows 手动访问数据。
我有一台装有 macOS 的 Apple 笔记本电脑、一台装有 Windows 的 Windows 笔记本电脑和一台装有 macOS 的虚拟机。所以我使用终端。
备份存储在可.sparsebundle
通过(或 SMB)从 Finder 访问的文件中afp://10.0.1.1
,并可从 Finder 将其安装为名为的卷Time Machine Backups
。
备份里面的文件结构是这样的:
Backups.backupdb/MacBook Air/2013-01-01-000000/Macintosh HD/Users/TimApple/Desktop
├───Directory1
│ ├───File1.txt
│ └───File2.txt
├───Directory2
│ ├───File3.txt
│ └───File4.txt
├───File5.txt
└───File6.txt
Backups.backupdb/MacBook Air/2014-01-01-000000/Macintosh HD/Users/TimApple/Desktop
├───Directory1 (hard link to 2013-01-01-000000)
│ ├───File1.txt (hard link to 2013-01-01-000000)
│ ├───File2.txt (hard link to 2013-01-01-000000)
│ └───File7.txt
├───Directory2 (hard link to 2013-01-01-000000)
│ ├───File3.txt (hard link to 2013-01-01-000000)
│ ├───File4.txt (hard link to 2013-01-01-000000)
│ └───File8.txt
├───File5.txt (hard link to 2013-01-01-000000)
├───File6.txt (hard link to 2013-01-01-000000)
└───File9.txt
Backups.backupdb/MacBook Air/2015-01-01-000000/Macintosh HD/Users/TimApple/Desktop
├───Directory1 (hard link to 2013-01-01-000000)
│ ├───File1.txt (hard link to 2013-01-01-000000)
│ ├───File2.txt (hard link to 2013-01-01-000000)
│ ├───File7.txt (hard link to 2014-01-01-000000)
│ └───File10.txt
├───Directory2 (hard link to 2013-01-01-000000)
│ ├───File3.txt (hard link to 2013-01-01-000000)
│ ├───File4.txt (hard link to 2013-01-01-000000)
│ ├───File8.txt (hard link to 2014-01-01-000000)
│ └───File11.txt
├───File5.txt (hard link to 2013-01-01-000000)
├───File6.txt (hard link to 2013-01-01-000000)
├───File9.txt (hard link to 2014-01-01-000000)
└───File12.txt
我尝试实现的文件结构如下:
/Volumes/My Passport/MacBook Air/Desktop/2013-01-01-000000/
├───Directory1
│ ├───File1.txt
│ └───File2.txt
├───Directory2
│ ├───File3.txt
│ └───File4.txt
├───File5.txt
└───File6.txt
/Volumes/My Passport/MacBook Air/Desktop/2014-01-01-000000/
├───Directory1
│ └───File7.txt
├───Directory2
│ └───File8.txt
└───File9.txt
/Volumes/My Passport/MacBook Air/Desktop/2015-01-01-000000/
├───Directory1
│ └───File10.txt
├───Directory2
│ └───File11.txt
└───File12.txt
我可以提取全部的数据rsync
(如建议这个答案),但它不会尊重硬链接-H
开关。无论目标文件系统是 exFAT(不支持硬链接)还是 HFS+(支持硬链接),这都会导致所有硬链接文件重新复制到每个文件夹:
cd /Volumes/Time\ Machine\ Backups/Backups.backupdb/MacBook\ Air
for F in *; do rsync --progress --ignore-existing -avz -H $F/Macintosh\ HD/Users/TimApple/Desktop /Volumes/My\ Passport/MacBook\ Air/Desktop/$F; done
某人说“请注意,硬链接无法跨单独的文件系统挂载工作。” — 也许这就是它无法满足我需求的原因。即使它能工作,也会在“最新”备份文件夹中留下大量硬链接,而这毕竟不是我需要的。
我也读过这篇博客文章使用rsync
--link-dest=
开关:
rsync -avz --progress --link-dest=PATHTO/$PREVIOUSBACKUP $SOURCE $CURRENTBACKUP
但我不知道如何使用--link-dest=
switch:我应该使用什么来$PREVIOUSBACKUP
链接到每个备份日期的文件夹?例如,如果我使用2013-01-01-000000
位置$PREVIOUSBACKUP
,它将无法正常工作,并且rsync
只会在...中查找要硬链接的文件。2013-01-01-000000
我应该手动获取所有日期的文件夹列表并--link-dest=
为每个文件夹编写单独的命令吗?不管是什么,这对我来说都行不通,因为我不需要硬链接,因为 exFAT 不支持此功能。
因此我想出了一个计划,需要一些批评和帮助:
复制我需要的文件夹的第一个备份(没有硬链接),即
Backups.backupdb/MacBook Air/2013-01-01-000000/Macintosh HD/Users/TimApple/Desktop
生成一个 TXT 文件,其中包含发生增量备份的所有“其他”日期的文件夹列表:
备份.backupdb/MacBook Air/2014-01-01-000000/Macintosh HD/用户/TimApple/桌面 备份.backupdb/MacBook Air/2015-01-01-000000/Macintosh HD/用户/TimApple/桌面
对于每个“其他”增量备份,生成一个单独的 TXT 文件,其中包含添加到最新文件夹的唯一文件列表(如建议的那样这个答案), IE:
由于 Time Machine 使用硬链接来存储未修改的文件(和目录),这意味着最新备份中更改的文件的链接数将为 1,因为它们是唯一的。将其与 find 一起使用可生成列表
cd /Volumes/Time\ Machine\ Backups/Backups.backupdb/MacBook\ Air
find 2014-01-01-000000/Macintosh\ HD/Users/TimApple/Desktop -type f -links 1 -print
find 2015-01-01-000000/Macintosh\ HD/Users/TimApple/Desktop -type f -links 1 -print
- 用于
rsync
仅复制步骤 3 中收集的 TXT 文件,使用--files-from=
简要描述的开关这里。
我不太熟悉终端,所以请告知我的计划是否可行,如果可能的话,请帮助完成这些步骤。
答案1
我不建议使用自定义脚本来改变备份的结构和存储方式。尤其是对于刚开始使用终端的人来说。数据丢失的风险太大,无论是目录存储方式的反转,还是重复数据删除部分。
如果您希望从 macOS 平台迁移,请在所需的时间点恢复所有需要的数据。也许将 SMB 安装连接到 Windows,然后从 Explorer 手动复制一个时间点。或者,恢复到 macOS,创建一个包含相关文件的 zip 存档,将其传输过来并提取。由于 Time Machine 不是 Windows 的东西,请在新平台上启动不同的备份程序。保留 Time Machine 备份以备需要更多恢复时使用。
rsync 能够维护源中存在的硬链接。即使目标位于不同的文件系统上。但是,由于以下几个原因,这不起作用:
extFAT 目标不支持链接。
您提议的脚本循环遍历日期戳并为每个日期戳运行 rsync 命令。日期之间的硬链接现在不在一个 rsync 命令的源集中。即使目标确实支持硬链接,rsync --hard-links
单独使用它们也不会进行重复数据删除。
rsync --link-dest=DIR
检查 DIR 中的重复文件并将它们硬链接到目标。请注意,执行重复数据删除的是 rsync,而不是 Time Machine。当然,当目标不支持链接时,这将不起作用。
rsync --compare-dest=DIR
行为不同,但在链接不可用时可以作为替代方案。当 DIR 中存在重复项时,不会传输文件。减少了使用的空间,但现在您需要手动查看以前的日期以查找所有文件。理论上很有用:复制所有最新树,然后使用 --compare-dest 来创建较旧的稀疏备份。