如何使用命令行删除 Time Machine 文件

Tim*_*Tim 72 mac command-line time-machine macos

我想使用rm从我的 Time Machine 分区中删除一些文件/目录,但我无法这样做。我很确定问题与备份中文件的某种访问控制扩展属性有关,但不知道如何覆盖/禁用它们以使rm工作。我得到的错误的一个例子是:

% sudo rm -rf Backups.backupdb/MacBook/Latest/MacBook/somedir
rm: Backups.backupdb/MacBook/Latest/MacBook/somedir: Directory not empty
rm: Backups.backupdb/MacBook/Latest/MacBook/somedir/somefile: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

我不想为此使用 Time Machine GUI 或 Finder 的原因有很多。如果可能,我希望能够保持对所有其他文件的扩展保护(我不想全局禁用它们,除非我完成工作后可以重新启用)。

Eri*_*c W 124

要解决“不允许操作”错误,请使用Time Machine Safety Net “bypass”程序:

sudo /System/Library/Extensions/TMSafetyNet.kext/Contents/MacOS/bypass rm -rfv /Volumes/[disk]/Backups.backupdb/[path]
Run Code Online (Sandbox Code Playgroud)

在 10.8 Mountain Lion 中,bypass 移至“Helpers”:

/System/Library/Extensions/TMSafetyNet.kext/Helpers/bypass
Run Code Online (Sandbox Code Playgroud)

在 10.10 Yosemite 中,绕过移动到这里:

/System/Library/Extensions/TMSafetyNet.kext/Contents/Helpers/bypass
Run Code Online (Sandbox Code Playgroud)

使用它删除特定快照时要小心:由于 Time Machine 使用硬链接,因此rm -r在文件夹上使用也可能会影响同一台机器的旧快照和新快照。(请参阅有关tmutil delete安全删除特定快照的其他答案。)虽然rm可以删除单个机器的所有快照。因此rm用于删除特定文件,它只会从您指定的快照中删除该硬链接文件,假设该文件不在硬链接目录中,那么您实际上会从所有文件中删除该文件那些硬链接的目录。

  • 这是管理 Time Machine 文件的一种极其危险的方法;Time Machine 使用硬链接目录来引用自上次备份以来未更改的文件夹,但是 `rm` 进程不理解这些,并将遵循这些链接并从中删除文件。这意味着您可能会删除与您选择的备份相比旧的和新的备份中的文件,从而可能对备份造成无法修复的损坏。Arne Stensröm 推荐的使用 `tmutil` 是迄今为止最好的解决方案。 (7认同)
  • 惊人的。这有效。(虽然我省略了 'v' 选项以避免看到几十万个文件中的每一个的条目)即:`sudo ...bypass rm -rf /Volumes/...` (3认同)
  • 稍微扩展 Haravikk 的评论:将 `rm` 用于硬链接的 *files* 是可以的,但对于硬链接的 *folders* 则不然。[Kent 的回答](http://superuser.com/a/557425) 提到了同样的问题。在 [在 OS X 中创建一个目录的硬链接的 Unix 命令是什么?](http://stackoverflow.com/a/2038065) 中,有人在 2010 年为 10.5 编写:*“删除是另一回事:如果你使用删除目录的常用方法,您将删除内容。因此,您必须“取消链接”目录:`unlink new_hard_link`"。* 所以只能使用它来删除给定机器的*所有* 备份(快照) . (2认同)

Arn*_*röm 29

BLUF(前底线):

sudo tmutil delete snapshot-dir


使用从文件夹层次结构中删除所有的ACL不上时间机器的文件和文件夹的工作Backups.backupdb,因为TM安全网机制,并在此说明的标准318科技期刊(但可能不完全描述) .     (在通过查找 Eric W 的答案(有效)中提到的安全网学习这一点之前,我只测试了从 TM 备份的子文件夹克隆的文件夹,并且chmod工作。但是在实际的文件夹上尝试chmod TM 备份给出“不允许操作”错误。)sudo chmod -R -N folder

可能的用途:
    在 Mac OS 10.7+ 中,有一个tmutil命令(我还没有尝试过,因为我仍在使用 Snow Leopard)。它有一个删除动词,根据描述“可以从不是由当前机器制作或没有声明的备份中删除快照”(其中“快照”是表示单个增量备份的日期文件夹)。它不是,如果这意味着,它很清楚,我无法删除快照,其由制造或由当前机器声称。(?)

  • 确实,tmutil 很有用,并且允许您删除备份(`tmutil delete /Volumes/DISK/Backups.backupdb/HOST/DATE_FOLDER`)。但是,您仍然需要 Eric 的绕过技巧来删除“Backups.backupdb”文件夹本身。 (2认同)

Ken*_*ent 14

关于使用该bypass命令删除旧备份的警告:如果删除的备份与之前或之后的备份中的文件夹完全相同,那么文件也可能会从之前或之后的备份中删除

Time Machine 不仅对未更改的文件使用硬链接,而且对根本没有添加、更改或删除文件的文件夹使用硬链接。这会导致类似的结果:

/2014-11-06/folder/file1
                  /file2
                  /file3
/2014-11-13/folder/file1 = hard link to file /2014-11-06/folder/file1
                  /file2 (changed; new inode)
                  /file3 = hard link to file /2014-11-06/folder/file3
/2014-11-20/folder/ = hard link to folder /2014-11-13/folder/
/2014-11-27/folder/ = hard link to folder /2014-11-20/folder/
Run Code Online (Sandbox Code Playgroud)

有了上述内容,从中删除任何文件/2014-11-06/folder/都可以,并且只会影响该日期的备份。硬链接引用计数减少,因此“ inode ” forfile2将被删除,但由于稍后的备份,inode forfile1file3的引用计数仍为 1。因此, rm -R /2014-11-06也很好。

但是,从/2014-11-13/folder/,/2014-11-20/folder/或 中删除任何文件/2014-11-27/folder/都会有效地将其从所有这 3 个文件夹中删除。

问题是rm -R不关心硬链接文件夹。它只是递归到它找到的任何硬链接文件夹,大胆地删除它的所有文件,然后删除空文件夹。

所以:删除旧备份时,不应递归到硬链接文件夹并删除其内容。相反,应该只删除文件夹本身的硬链接。所以,而不是像Arne's answer 中解释的那样rm -R使用。tmutil delete

顺便说一句,似乎 OS Xunlink命令不能用于文件夹“只能提供一个不能是目录的参数”。OS X API 可以删除硬链接文件夹,GNU Coreutils也可以,例如使用Homebrew安装。

最后,为了证明以上所有内容,一个测试用例(OSX 10.6.8):

sh-3.2# ls -lFa 2014-11*/Users/USERNAME/Library/Safari/TopSites.plist 
-rw-r--r--@ 2 USERNAME  staff  1551 10 30  2014 2014-11-06-012454/Users/USERNAME/Library/Safari/TopSites.plist
-rw-r--r--@ 2 USERNAME  staff  1551 10 30  2014 2014-11-13-024438/Users/USERNAME/Library/Safari/TopSites.plist
-rw-r--r--@ 2 USERNAME  staff  1551 10 30  2014 2014-11-20-014044/Users/USERNAME/Library/Safari/TopSites.plist
-rw-r--r--@ 2 USERNAME  staff  1551 10 30  2014 2014-11-27-025033/Users/USERNAME/Library/Safari/TopSites.plist
Run Code Online (Sandbox Code Playgroud)

请注意,每次出现的链接数为 2(第二列)。让我们删除第一次出现:

sh-3.2# /System/Library/Extensions/TMSafetyNet.kext/Contents/MacOS/bypass unlink 2014-11-06-012454/Users/USERNAME/Library/Safari/TopSites.plist 
Run Code Online (Sandbox Code Playgroud)
sh-3.2# ls -lFa 2014-11*/Users/USERNAME/Library/Safari/TopSites.plist 
-rw-r--r--@ 1 USERNAME  staff  1551 10 30  2014 2014-11-13-024438/Users/USERNAME/Library/Safari/TopSites.plist
-rw-r--r--@ 1 USERNAME  staff  1551 10 30  2014 2014-11-20-014044/Users/USERNAME/Library/Safari/TopSites.plist
-rw-r--r--@ 1 USERNAME  staff  1551 10 30  2014 2014-11-27-025033/Users/USERNAME/Library/Safari/TopSites.plist
Run Code Online (Sandbox Code Playgroud)

因此,在取消其中一个文件的链接后,每次出现的链接数都会下降到 1 个,尽管该文件仍会显示 3 次。还没有问题。再次删除第一次出现:

sh-3.2# /System/Library/Extensions/TMSafetyNet.kext/Contents/MacOS/bypass unlink 2014-11-13-024438/Users/USERNAME/Library/Safari/TopSites.plist 
Run Code Online (Sandbox Code Playgroud)
sh-3.2# ls -lFa 2014-11*/Users/USERNAME/Library/Safari/TopSites.plist 
ls: 2014-11*/Users/USERNAME/Library/Safari/TopSites.plist: No such file or directory
Run Code Online (Sandbox Code Playgroud)

现在一切都没有了。显然,该文件TopSites.plist最后一次更改是在 2014 年 11 月 6 日,并在 2014 年 11 月 13 日进行了硬链接,因为随后在Safari文件夹中添加、更改或删除了一些其他文件。接下来,Safari文件夹的内容在随后的两次备份中没有改变,因此在 2014-11-20 和 2014-11-27Safari文件夹被硬链接到之前的备份。

实际上,这 4 个文件夹仅使用 2 个 inode(第一列):

sh-3.2# ls -lFaid 2014-11*/Users/USERNAME/Library/Safari/
648651968 drwxr-xr-x@ 86 USERNAME  staff  2924  9 10 16:06 2014-11-06-012454/Users/USERNAME/Library/Safari//
650804457 drwxr-xr-x@ 86 USERNAME  staff  2924  9 10 16:07 2014-11-13-024438/Users/USERNAME/Library/Safari//
650804457 drwxr-xr-x@ 86 USERNAME  staff  2924  9 10 16:07 2014-11-20-014044/Users/USERNAME/Library/Safari//
650804457 drwxr-xr-x@ 86 USERNAME  staff  2924  9 10 16:07 2014-11-27-025033/Users/USERNAME/Library/Safari//
Run Code Online (Sandbox Code Playgroud)