如何在OSX中的命令行上复制文件夹时保留别名?

时间:2015-12-30 01:12:31

标签: linux macos rsync cp

我正在尝试在OSX上编写个人备份命令行实用程序。假设我有两个文件夹:

foo/bar/
foo/baz/

foo/bar包含foo/baz中文件的OSX别名:

foo/bar/file_alias@ -> foo/baz/file 

我想将foo/barfoo/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的情况下完成此操作?

2 个答案:

答案 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