MacOS 中的 cp -r -l (递归复制保留硬链接)

MacOS 中的 cp -r -l (递归复制保留硬链接)

我正在尝试以递归方式复制目录树,同时保留指向文件的硬链接。使用 gnu cp,这将与 -l 标志一起使用。cp 随后将重新创建目录结构,但不需要复制每个文件的内容。

这是备份的准备工作,首先我想制作上一个备份的廉价(硬链接)副本,然后通过此副本 rsync 源目录。大致如下:

 cp -r -l yesterdays_backup todays_backup
 rsync -a source_dir todays_backup

不幸的是,OSX 的 cp 不支持 -l 标志,据我所知,cpio 不支持递归复制。另一种选择是 pax,但这会导致复制整个目录结构:

 pax -rw backups/yesterdays_backup backups/todays_backup

变换:

 yesterdays_backup
 |
  \source_dir (...)

到:

 todays_backup
 |
  \backups
          \yesterdays_backup
                            \source_dir(...)

应该有一种简单/明显的方法来做到这一点,但我现在很困惑... cpio 和 pax 有替代品吗?我想避免安装 gnu cp。

我知道 Timemachine,但它无法正确地逐步备份加密目录。

答案1

从 MacPorts 安装 cp 非常简单,但是,如果您不想这样做,或者想要创建一个可移植脚本,那么您有三个选择:

同步

rsync --archive --link-dest=../yesterdays_backup backups/yesterdays_backup\
   backups/todays_backup

太平洋保险协会

mkdir backups/todays_backup
cd backups/yesterdays_backup
find . -print | cpio -p -al ../todays_backup

帕克斯

mkdir backups/todays_backup
cd backups/yesterdays_backup
pax -rwl . ../todays_backup

答案2

安装该coreutils软件包非常简单麦金塔cp其中包含重命名为 的GNU命令gcp

但更好的是,较新版本的 rsync(至少包括 OS X 10.5 中的版本)支持 --link-dest 选项,这应该消除了对初始 cp -al 的需求。请参阅这里。使用 -E 选项来复制扩展属性、ACL 等也是很好的做法。

答案3

macOS Finder 复制正确,保留了硬链接,即使是到不同的卷。但是仅有的如果这是一个简单的 1 项复制而没有加入。

  • 您可以立即查看它是否有效,因为如果有效,则“要复制”的数量就是净大小,就像 du 报告的那样。如果由于某种原因复制未保留硬链接,则您会发现大小太大,可以立即停止。
  • 如果需要复制或合并更复杂文件夹结构的部分,请将源移动到用于复制的父文件夹中。稍后将复制的项目移动到目标上的正确位置显然会保留硬链接。

答案4

虽然cpio不直接支持递归复制,但你可以将要复制的文件的精确列表输入到其标准输入中,并通过find管道输入实现递归复制的效果。这与使用 GNU 的选项(即从标准输入读取要备份的文件列表)cpio直接类似。tar-T -

相关内容