Macos 用脚本清理一个备用堆

Macos 用脚本清理一个备用堆,macos,bash,osx-mountain-lion,timemachine,Macos,Bash,Osx Mountain Lion,Timemachine,我正在使用time machine将一些服务器备份到一个稀疏磁盘映像包,我希望有一个脚本来清理旧的备份,并在释放空间后重新调整映像的大小。我相当肯定数据是受保护的,因为如果我通过右键单击删除旧备份,我必须输入密码才能删除它们。为了让我的脚本能够删除它们,我一直以root用户身份运行它。由于某些原因,它不会运行,它试图删除的每个文件都会被删除 rm: /file/: Operation not permitted 以下是我的脚本: #!/bin/bash for server in serve

我正在使用time machine将一些服务器备份到一个稀疏磁盘映像包,我希望有一个脚本来清理旧的备份,并在释放空间后重新调整映像的大小。我相当肯定数据是受保护的,因为如果我通过右键单击删除旧备份,我必须输入密码才能删除它们。为了让我的脚本能够删除它们,我一直以root用户身份运行它。由于某些原因,它不会运行,它试图删除的每个文件都会被删除

rm: /file/: Operation not permitted
以下是我的脚本:

#!/bin/bash

for server in servername; do
    /usr/bin/hdiutil attach -mountpoint /path/to/mountpoint /path/to/sparsebundle/$server.sparsebundle/;
    /bin/sleep 10;
    /usr/bin/find /path/to/mountpoint -type d -mtime +7 -exec /bin/rm -rf {} \;
    /usr/bin/hdiutil unmount /path/to/mountpoint;
    /bin/sleep 10;
    /usr/bin/hdiutil compact /path/to/sparsebundle/$server.sparsebundle/;
    done

exit;
我认为造成这种情况的一个问题是需要指定一个装入点,因为默认装入是到/Volumes/Time\Machine\Backups/这就是我创建装入点的原因。我还认为它试图在挂载后快速删除文件,但实际上还没有挂载,这就是我添加睡眠的原因。我还尝试使用
-delete
选项来查找,而不是
-exec
,但没有任何区别


如果能在这方面提供任何帮助,我将不胜感激,因为我不知道为什么这样做行不通。

首先,以这种方式细化备份是一个非常糟糕的主意。首先,当您在目录上使用find的
-mtime
测试时,您正在检查上次修改该目录的时间;您需要检查的是上次修改该目录中的内容的时间。例如,我的Mac上的/(根目录)已经修改了10天了,所以如果我在备份中使用了你的脚本(并且成功),它将从所有备份(包括最新的备份)中删除我的整个启动卷

其次,您正在破坏Time Machine精心安排的备份结构,这可能会破坏备份(甚至包括将来的备份)。不要这样做

(注意:当以root用户身份运行时,每当您看到命令
rm
后接
-Rf
时,请确保在按return键之前知道它指向什么。)

现在,至于实际问题,我怀疑您遇到了一个内核扩展,它试图防止对TM的备份造成损坏。这是一件好事(见最后一点),您不应该禁用它

不过,有一个简单的解决方案:使用时间机器。具体地说,使用
tmutil delete/path/to/snapshot
删除旧的快照。快照路径类似于
/path/to/mountpoint/Backups.backupdb/


请注意,删除旧快照实际上只删除与其他快照不共享的文件;因此,如果您删除了一周以前的所有快照,您就不会删除(备份)一周内未修改的文件,而是删除了一周多以前删除的文件。哪个更可能是您想要的…

首先,以这种方式细化备份是一个非常糟糕的主意。首先,当您在目录上使用find的
-mtime
测试时,您正在检查上次修改该目录的时间;您需要检查的是上次修改该目录中的内容的时间。例如,我的Mac上的/(根目录)已经修改了10天了,所以如果我在备份中使用了你的脚本(并且成功),它将从所有备份(包括最新的备份)中删除我的整个启动卷

其次,您正在破坏Time Machine精心安排的备份结构,这可能会破坏备份(甚至包括将来的备份)。不要这样做

(注意:当以root用户身份运行时,每当您看到命令
rm
后接
-Rf
时,请确保在按return键之前知道它指向什么。)

现在,至于实际问题,我怀疑您遇到了一个内核扩展,它试图防止对TM的备份造成损坏。这是一件好事(见最后一点),您不应该禁用它

不过,有一个简单的解决方案:使用时间机器。具体地说,使用
tmutil delete/path/to/snapshot
删除旧的快照。快照路径类似于
/path/to/mountpoint/Backups.backupdb/


请注意,删除旧快照实际上只删除与其他快照不共享的文件;因此,如果您删除了一周以前的所有快照,您就不会删除(备份)一周内未修改的文件,而是删除了一周多以前删除的文件。这更可能是您想要的…

虽然这是一个旧线程,但需要指出的是,time machine bundle中的备份不是副本,而是指向文件的链接(使用硬链接),这意味着如果文件没有更改,那么文件的副本只会占用几个字节的开销,所以,仅仅因为可以看到一个文件的多个副本,并不意味着它们都在使用物理空间

从()---------

当时间进行第一次备份时,它会复制所有内容(除了一些系统工作文件、垃圾等)。它还制作了一个过时的备份文件夹,并在其中放置了指向它刚制作的所有备份副本的硬链接。然后,当Time Machine进行第二次备份时,它会复制自第一次备份以来更改的所有内容,创建另一个已过时的备份文件夹,并在其中添加指向新备份项的硬链接。到目前为止,一切顺利

但诀窍在于:它还将硬链接放在第二个备份文件夹中,指向未更改的项目。因此,该文件夹现在包含指向第二次备份时系统上所有内容的链接



虽然这是一个旧线程,但需要指出的是,time machine bundle中的备份不是副本,而是指向文件的链接(使用硬链接),这意味着如果文件没有更改,那么文件的副本将只需要几字节的开销,因此,仅仅因为您可以看到一个文件的多个副本,并不意味着它们都在使用ph