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


68

我想使用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

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


我走近了。首先,我需要在Time Machine磁盘上禁用ACL。以前,人们会使用fsaclctl来执行此操作,但是Snow Leopard不包含此功能。我从旧版OSX中获取了二进制文件的副本并运行了此命令:%sudo fsaclctl -p / Volumes / tmvol -d然后我尝试使用“ sudo rm -rf”删除目录,但仍然遇到问题一些文件(尽管其他文件消失了)。具体来说,它在软链接上失败。很奇怪。从好的方面来说,链接几乎不占用空间。消极的一面,我仍然有目录。
蒂姆(Tim)

在删除快照或快照中的文件夹(例如)时,似乎可以接受的答案非常危险rm -r Backups.backupdb/MacBook/Latest/MacBook/somedir。如果您同意,那么请接受Arne的回答?
Arjan

Answers:


115

要变通解决“不允许操作”错误,请使用Time Machine安全网 “绕过”程序:

sudo /System/Library/Extensions/TMSafetyNet.kext/Contents/MacOS/bypass rm -rfv /Volumes/[disk]/Backups.backupdb/[path]

在10.8 Mountain Lion中,绕行转移到“助手”中:

/System/Library/Extensions/TMSafetyNet.kext/Helpers/bypass

在10.10优胜美地,绕过了此处:

/System/Library/Extensions/TMSafetyNet.kext/Contents/Helpers/bypass

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


+1!这对我有帮助。我什至没有尝试其他方法,因为这看起来像是“正确的方法”,的确,它使我能够毫无问题地解决问题。谢谢!
2012年

我创建了一个帐户,只是为您+1。我一直在寻找一个更好的解决方案,就是这样。它让我发疯。谢谢。
CWSpear 2012年

3
太棒了 这可行。(尽管我省略了“ v”选项,以避免看到数十万个文件的每个条目),例如:sudo ...bypass rm -rf /Volumes/...
Brent Faust 2012年

6
这是管理Time Machine文件的极其危险的方法。Time Machine使用硬链接目录来引用自上次备份以来未更改的文件夹,但是该rm过程无法理解这些文件夹,因此将跟踪这些链接并从其中删除文件。这意味着您可能会删除同时位于比您选择的旧备份和新备份中的文件,从而可能对备份造成无法修复的损害。tmutil到目前为止,ArneStenström的使用建议是最好的解决方案。
Haravikk 2013年

1
进一步说明一下Haravikk的评论:可以rm对硬链接的文件使用,但是对于硬链接的文件夹则不能。肯特的答案提到了同样的问题。在Unix命令中,如何在OS X中创建到目录的硬链接?有人在2010年为10.5写信:“删除是另一回事:如果按照通常的删除目录的方式进行操作,则将删除内容。因此,您必须“取消链接”目录:unlink new_hard_link“。因此,仅使用此功能删除给定计算机的所有备份(快照)。
Arjan 2015年

26

BLUF(最下面的线):

sudo tmutil delete snapshot-dir


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

可能的用途:
    在Mac OS 10.7+中,有一个tmutil命令(由于我仍在Snow Leopard上,所以我没有尝试过)。它有一个删除动词,根据描述,该动词是“可以从不是由当前计算机进行备份或未被其声明的备份中删除快照”(其中“快照”是表示单个增量备份的带日期的文件夹)。这是我不太清楚,如果这意味着它不能删除的快照由制造或声称目前该机(?)


2
实际上,tmutil很有用,它将允许您删除备份(tmutil delete /Volumes/DISK/Backups.backupdb/HOST/DATE_FOLDER)。但是,您仍然需要Eric的绕过技巧来删除“ Backups.backupdb”文件夹本身。
mivk 2012年

我的OSX 10.8.3(Mountain Lion)不需要旁路。只是sudo tmutil delete <snapshot-dir>。流行的bypass rm答案已经过时了。
John Mee

是否可以使用tmutil快照中的某些文件删除?它对我不起作用(Invalid deletion target (error 22)),所以我选择了bypass
罗伯特·图珀洛-施内克

+1为BLUF。您是从(功能强大的)管理器工具中获得的吗?:)
Olie 2015年

另外:我一直在查找对Backups.backupdb备份驱动器(时间胶囊)中没有的目录的引用。我只是有形式的东西MachineName.sparsebundle。格式改变了吗?我正在尝试使用TM的delete backup命令,但是它在99.99%的进度条上停留了几个小时。
奥利2015年

12

关于使用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/

通过上述操作,删除中的任何文件/2014-11-06/folder/都很好,并且仅影响该日期的备份。硬链接引用计数减少,所以“ 索引节点 ”的file2将被删除,但为索引节点file1file3仍然有1引用计数由于后续备份。因此, rm -R /2014-11-06也可以。

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

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

因此:删除旧备份时,不应将其递归到硬链接文件夹中并删除其内容。相反,应该只删除文件夹本身的硬链接。因此,不要像Arne的答案中所解释的那样rm -R使用。tmutil delete

顺便说一句,似乎OS X unlink命令不能在文件夹上使用“只能提供一个参数,不能为目录。” 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

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

sh-3.2# /System/Library/Extensions/TMSafetyNet.kext/Contents/MacOS/bypass unlink 2014-11-06-012454/Users/USERNAME/Library/Safari/TopSites.plist 
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

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

sh-3.2# /System/Library/Extensions/TMSafetyNet.kext/Contents/MacOS/bypass unlink 2014-11-13-024438/Users/USERNAME/Library/Safari/TopSites.plist 
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

现在一切都消失了。显然,该文件的TopSites.plist最后更改时间为2014-11-06,并于2014-11-13进行了硬链接,随后在该Safari文件夹中添加,更改或删除了其他文件。接下来,该Safari文件夹的内容在随后的两个备份中没有更改,因此在2014-11-20和2014-11-27将该Safari文件夹硬链接到上一个备份。

实际上,这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//

1
一些背景:对于文件,硬链接可以正常工作;仅删除要删除的硬链接。像:touch file1; ln file1 file2; ln file2 file3; ls -li; rm file2; ls -li只会删除一个硬链接。但是对于文件夹在OS X中创建到目录的硬链接的Unix命令是什么?有人在2010年为10.5写信:“删除是另一回事:如果按照通常的删除目录的方式进行操作,则将删除内容。因此,您必须 “取消链接”目录:unlink new_hard_link“。这可能仍然有效。
Arjan 2015年

unlink(在10.6.8中)的手册页指出,不能在目录上使用它 When the utility is called as unlink, only one argument, which must not be a directory, may be supplied
肯特

嗯,神秘。更重要的是,您的答案很重要:请勿[bypass] rm -r在硬链接目录上使用。(但我不必向您解释。)
Arjan 2015年

我只是尝试了一点。运行bypass unlink FILE具有与相同的结果(意外?)bypass rm FILE。从所有备份中删除相同的FILE,而不仅仅是指定的单个位置。并且,unlink不会将目录或多个文件作为参数(10.6.8服务器;但是,我认为在较新的OS版本中不会有所改变)
Kent

哇,我对很惊讶你bypass rm FILEbypass unlink FILE删除所有相同的文件,这不符合人们看到什么touch file1; ln file1 file2; ln file2 file3; ls -li; unlink file2; ls -li,也不对touch file1; ln file1 file2; ln file2 file3; ls -li; /System/Library/Extensions/TMSafetyNet.kext/Contents/Helpers/bypass unlink file2; ls -li。我永远不会从备份中删除某些东西……
Arjan 2015年

3

注意:由于Eric W提到了“ TM安全网”,因此该问题不适用于Time Machine备份,这是该问题专门涉及的情况。但对于大多数其他情况,有关如何清除ACL的信息是相关的。


无需使用从旧版操作系统复制的ACL工具。

使用ls -le查看ACL和chmod改变他们。

有关更多信息,man chmod请在“ ACL操作选项”下键入并查看。

从文件夹层次结构中删除所有ACL的命令是:

chmod -R -N foldername

2

时间机器的工作原理类似于rshapshot。它为每个新备份创建一个硬链接树。硬链接到先前备份中已经存在的文件仅占用很少的额外空间。只有在删除了到文件的最后一个硬链接后,该文件才实际从文件系统中删除。

删除整个单个备份不会有任何伤害。您只是删除硬链接。其他备份将不受影响。但这可以通过tmutil实现。

可能需要绕过保护的一种情况是从所有备份中删除特定文件(以及我最终写此帖子的原因)。

我的备份磁盘已满。我有一个很大的文件(许多GB),已经备份了几个月。它有一个物理副本,但有许多快照带有指向该副本的硬链接。要真正摆脱该文件,我需要从每个备份中删除硬链接。

请注意,指向同一文件的所有硬链接的索引节点号都相同。

% cd /Volumes/WD\ 500G\ USB/Backups.backupdb/csm-laptop
% ls -li */Macintosh\ HD/Users/csm/vm.img
...
2740350 -rw-r--r--@ 28 csm  staff  42949672960 Feb 17 16:12 2015-05-08-005636/Macintosh HD/Users/csm/vm.img
2740350 -rw-r--r--@ 28 csm  staff  42949672960 Feb 17 16:12 2015-05-08-015812/Macintosh HD/Users/csm/vm.img
2740350 -rw-r--r--@ 28 csm  staff  42949672960 Feb 17 16:12 2015-05-08-030036/Macintosh HD/Users/csm/vm.img
2740350 -rw-r--r--@ 28 csm  staff  42949672960 Feb 17 16:12 2015-05-08-041307/Macintosh HD/Users/csm/vm.img
2740350 -rw-r--r--@ 28 csm  staff  42949672960 Feb 17 16:12 Latest/Macintosh HD/Users/csm/vm.img

(最新只是到最后一个日期目录的符号链接)

% sudo bypass rm -f */Macintosh\ HD\Users\csm\vm.img

该文件将从所有备份中删除,并返回空间。如果文件随时间变化,则每个备份将具有完整副本,并且返回的空间将很大。


至于“删除整个单个备份不会受到伤害。您只是删除硬链接。不会影响其他备份。” :如果这是指快照单个机备份中,然后给肯特的(旧)的答案rm -r可能是(或:已经)的危险。比后悔更安全,并tmutil为此目的而使用。
Arjan 2015年

0

如果您不是以“拥有”备份的用户身份执行命令,那么将很难从命令行中删除。我只是在迁移过程中遇到了这个问题,我们不得不对整个Time Machine备份(1tb +)进行格式化,然后才能对驱动器进行格式化,然后才能对其进行任何访问-相信我,我尝试了一切措施来覆盖权限。


2
当我以管理员身份运行时,sudo应该允许我访问所有文件。我很确定这是一个ACL问题,我正在努力解决。
蒂姆(Tim)2010年

1
Nic,晚了几年,但万一您错过了它:请参阅Eric的答案
Arjan 2015年

@Tim:在给定不变属性(chattr)的情况下,该断言在其他unixoid系统上甚至都不成立。从理论上讲,根源将是规避任何安全网。
2015年

0

如果要删除文件夹中的所有文件,而不仅仅是特定文件,可以通过将文件夹添加到Time Machine的排除列表中来完成。(系统偏好设置->时间机器->选项。将文件夹拖到此处。)

下次执行备份时,该文件夹的副本将从以前的备份中删除。

现在,如果您确实想通过CLI进行此操作,则可以使用一种方法,尽管有点麻烦。

  1. 备份/Library/Preferences/com.apple.TimeMachine.plist
  2. 将/Library/Preferences/com.apple.TimeMachine.plist复制到可以使用它的地方。
  3. 将CD放入任何放置的位置。
  4. 执行
    plutil -convert xml1 com.apple.TimeMachine.plist
    以将其从二进制格式转换。
  5. 在首选的文本编辑器中打开转换后的plist,搜索“ skippaths”
  6. 在该部分插入新行,格式为 <string>/Path/To/Exclude</string>
  7. 保存并退出,通过执行转换回来
    plutil -convert binary1 com.apple.TimeMachine.plist
  8. 将您编辑的plist复制回/ Library / Preferences /
  9. 通过执行开始备份
    /System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper -auto

编辑:执行步骤9时,将从先前的备份中删除新排除的文件夹的所有副本。

要删除该异常,请将备份复制回/ Library / Preferences。


我不是要排除目录。我正在尝试从现有备份中删除目录,并从命令行中执行一些操作。真的,我只是想弄清楚如何让rm在Backups.backupdb目录中工作。
蒂姆(Tim)2010年

好的,也许从我的说明中尚不清楚,执行上述步骤时实际上是从备份中删除了该文件夹。看到我的编辑。但是,如果这不是您要寻找的解决方案,那么我想您总是可以su - rootrm -rf选择文件夹,但是我认为以这种方式摆弄像备份这样珍贵的东西是人们通常应该避免的事情。
弗罗斯特(Frost),2010年

但是将其添加为排除项会从所有备份中删除其所有副本。另外,尽管这是一个TimeMachine备份,但它不是来自我正在执行此工作的计算机,因此它不再是活动的TimeMachine。sudo与“ su-root”和“ rm -rf”具有相同的作用。我很确定这是失败的,因为Apple已为文件系统增加了简单的* nix权限之外的安全级别。
蒂姆(Tim)2010年

这听起来可能很愚蠢,但我不完全确定其sudo效果与su - root在Mac上相同。我似乎记得有一次我试图删除一些sudo不足够但可以解决问题的东西sudo - root
弗罗斯特,2010年

3
@弗罗斯特-我认为Time Machine无法按照您的建议进行工作。我只是尝试排除一个文件夹,然后运行TM,并且该文件夹的旧备份仍存在于TM中。也许自从您一年前发布此消息以来,它的行为已经改变。
咖啡因昏迷

0

您可以ls使用该-@标志在较长的视图中设置列表扩展属性。提供-e标志时,它将列出ACL 。因此,您可以使用来查找要处理的内容ls -lea@ DIR

从我本地的Time Machine备份来看,Time Machine似乎将扩展属性与有关最新和最旧快照的元数据一起应用。xattrs存储的数据看起来是一个二进制plist。这些似乎是无害的。

Time Machine还希望将ACL应用于它知道的某些目录,例如放在标准用户目录中的目录。有两种可能会妨碍您使用的ACL:直接应用于拒绝删除的文件或目录的ACL,以及应用于拒绝delete_child的文件父级的ACL。

不幸的是,Mac OS X不提供用户实用程序,getfacl并且setfacl由POSIX.2c指定来查看和操作ACL。要弄乱ACL,您必须进行一些编程。请参阅acl(3)联机帮助页。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.