我正在尝试在OSX上编写个人备份命令行实用程序。假设我有两个文件夹:
foo/bar/
foo/baz/
foo/bar
包含foo/baz
中文件的OSX别名:
foo/bar/file_alias@ -> foo/baz/file
我想将foo/bar
和foo/baz
复制到外部硬盘,但出于各种原因,我不只想复制整个文件夹{{1} }。我无法找到一种方法来单独复制这些文件夹,并最终使别名出现:
foo
跟随别名,将其替换为原始文件。cp -r foo/bar /external_hd/foo/bar
会保留别名,但他们(毫不奇怪)会继续指向原始文件(例如cp -R foo/bar /external_hd/foo/bar
,而不是foo/baz/file
)。external_hd/foo/baz/file
(请参阅this question)似乎与rsync -avE foo/bar /external_hd/foo/bar
做同样的事情。有没有办法在不复制整个父文件夹cp -R
的情况下完成此操作?
答案 0 :(得分:1)
我知道在没有人工干预的情况下,您无法自动复制文件夹并将符号链接重新链接到新目的地。但是,如果你知道新的路径,那么脚本非常简单。
针对您的具体示例;以下内容应该是重新链接的技巧:
cd /external_hd/foo
find . -type l | while read x; do y=$(readlink "$x" | sed s'|/foo|/external_hd/foo|'); ln -sf "$y" "$x";done
答案 1 :(得分:0)
rsync
会让你关闭,命令:
rsync -avHER --safe-links foo/{bar,baz} /external_hd/
将复制这两个文件夹,保存" safe"相对符号链接,并忽略"不安全"符号链接 - 那些可能引用复制树之外的文件的符号链接。将其更改为:
rsync -avHER --copy-unsafe-links foo/{bar,baz} /external_hd/
和"安全"相对的符号链接是保留的,"不安全"符号链接由目的地替换。
如果你只有"安全"第一个选项将执行相对符号链接,如果某些额外复制正常,则第二个选项可以执行。
然而," safe"的定义过度限制。任何绝对的符号链接都是“不安全的”#34;即使它的目标在复制的树中。此外,即使是相对于根部太远的相对链接,或者可能太复杂,也是“不安全的”#34;。
如果你需要解决这个问题,那么应该可以,因为上面的选项显示rsync
非常接近你所需要的,源代码可以从Apple's Open Source site获得。检查选项--links
,--copy-links
,--copy-unsafe-links
&周围的代码。 unsafe-links
您可能会发现修复" safe"的定义相当容易(你可以重新编写符号链接以同时使用最短的相对路径)。
HTH