使用符号链接 cp 到目标层次结构?

使用符号链接 cp 到目标层次结构?

我正在尝试编写一个站点部署脚本,它将复制如下文件:

来源

.
..
src/
html/

目的地

.
..
src/
html/ -> /var/www/ftproot/mysite

我想要 SOURCE 中的文件html转到 DEST /var/www/ftproot/mysite

剧本是:

cd SOURCE
cp -Rf * DEST

每次运行脚本时,都会出现此错误:

cp: cannot overwrite non-directory 'html' with directory `html'

由此,我推断cp当 DEST 具有符号链接时,无法自动将文件复制到 DEST。

笔记:

  1. 下列的cp 手册,我设置POSIXLY_CORRECT为1。这不起作用。

  2. 我必须链接html到网站ftproot/mysite而不是相反,因为 ftp 用户的访问模式很奇怪。

  3. 这家伙修改的 cp源代码并重新编译。我不想对生产服务器这样做。

关于如何解决这个问题有什么想法吗?

答案1

对于任何文件复制,我建议rsync使用 ,cp因为它可以更精细地控制应该复制什么以及如何复制。对于你的情况,只需输入命令:

cd SOURCE
rsync -K -a . DEST

-K 选项完全按照您的要求执行:-K,--keep-dirlinks 将接收器上的符号链接目录视为目录

答案2

由于 cp 不会将 SOURCE 中的任何目录复制到 DEST 中的任何符号链接上,因此一种选择是针对每个符号链接单独复制这些目录。

使用方法寻找

cd DEST
cp -Rf SOURCE/* .
find -type l -exec bash -c 'cp -Rf "SOURCE/$0"/* "$0"' {} \;

细节

  • -type l将查找限制为符号链接。
  • -exec bash -c '...' {} \;...在 bash 子 shell 中对每个找到的符号链接执行,并将{}(符号链接的相对路径)作为第一个参数传递($0)。
  • cp -Rf "SOURCE/$0"/* "$0"将相应源目录的内容复制到符号链接指向的目录中。
  • cp 命令必须使用 bash 调用,因此 glob(星号)将会扩展。

注意事项

  • 我建议cpecho(或-Rf-Ri) 替换以确保 find 能够满足您的预期。
  • 如果不知道确切的目录结构和 DEST 中的符号链接,我无法保证我预见到了所有可能的异常情况。

相关内容