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

12 mac backup rsync cp

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

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

 cp -r -l yesterdays_backup todays_backup
 rsync -a source_dir todays_backup
Run Code Online (Sandbox Code Playgroud)

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

 pax -rw backups/yesterdays_backup backups/todays_backup
Run Code Online (Sandbox Code Playgroud)

变换:

 yesterdays_backup
 |
  \source_dir (...)
Run Code Online (Sandbox Code Playgroud)

到:

 todays_backup
 |
  \backups
          \yesterdays_backup
                            \source_dir(...)
Run Code Online (Sandbox Code Playgroud)

应该有一个简单/明显的方法来做到这一点,但我目前很难过...... cpio 和 pax 的任何替代方案?我想避免安装 gnu cp。

我知道 Timemachine,但它不能正确地增量备份加密目录。

小智 15

从 MacPorts 安装 cp 很容易,但是,如果您不想或想要创建可移植脚本,那么您有三个选择:

同步

rsync --archive --link-dest=../yesterdays_backup backups/yesterdays_backup\
   backups/todays_backup
Run Code Online (Sandbox Code Playgroud)

cpio

mkdir backups/todays_backup
cd backups/yesterdays_backup
find . -print | cpio -p -al ../todays_backup
Run Code Online (Sandbox Code Playgroud)

大伙儿

mkdir backups/todays_backup
cd backups/yesterdays_backup
pax -rwl . ../todays_backup
Run Code Online (Sandbox Code Playgroud)


小智 6

coreutilsMacPorts安装包很容易,其中包含cp重命名为gcp.

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