在MacOS中为cp -r -l(递归副本保留硬链接)


12

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

这是备份的初步准备,首先我想为先前的备份制作一个便宜的(硬链接)副本,然后在该副本上重新同步源目录。大致:

 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,但这不会正确地增量备份加密的目录。

mac  backup  rsync  cp 

结合使用cpio和find来解决缺少递归cpio的问题,如此处所述:(mikerubel.org/computers/rsync_snapshots/#Incremental)但看起来不是很优雅……

Answers:


16

从MacPorts安装cp很容易,但是,如果您不想或想要创建一个可移植的脚本,则可以使用以下三个选项:

同步

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

cpio

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

7

coreutilsMacPorts安装软件包很容易,该软件包包含cp重命名为的GNU 命令gcp

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


1

尽管cpio不直接支持递归复制,但是您可以将要复制的文件的确切列表输入到其标准输入中,并通过使用find管道插入来实现递归复制的效果cpio。这直接类似于使用tar带有选项的GNU -T -(这意味着读取文件列表以从标准输入中备份)。


1

我相信您也可以用实现ditto yesterdays_backup todays_backup。默认情况下,ditto执行保留硬链接,ACL和扩展属性的递归副本。


问题是,当目标是跨目录范围创建硬链接时,副本不再便宜。同上可以保留它们的存在,但是不能告诉它们链接而不是创建一个副本。
Florenz

我不认为ditto甚至可以被告知保留目录硬链接。手册页说,它仅记录硬链接
Chris F Carroll

0

+1为Pauls的答案。同上也是一种选择,但仅当与find结合使用时-确实保留硬链接,但仅保留在目录内。

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.