我正在尝试以递归方式复制目录树,同时保留指向文件的硬链接。使用 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
答案3
macOS Finder 复制正确,保留了硬链接,即使是到不同的卷。但是仅有的如果这是一个简单的 1 项复制而没有加入。
- 您可以立即查看它是否有效,因为如果有效,则“要复制”的数量就是净大小,就像 du 报告的那样。如果由于某种原因复制未保留硬链接,则您会发现大小太大,可以立即停止。
- 如果需要复制或合并更复杂文件夹结构的部分,请将源移动到用于复制的父文件夹中。稍后将复制的项目移动到目标上的正确位置显然会保留硬链接。
答案4
虽然cpio
不直接支持递归复制,但你可以将要复制的文件的精确列表输入到其标准输入中,并通过find
管道输入实现递归复制的效果。这与使用 GNU 的选项(即从标准输入读取要备份的文件列表)cpio
直接类似。tar
-T -