
我正在尝试编写一个站点部署脚本,它将复制如下文件:
来源
.
..
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。
笔记:
下列的cp 手册,我设置
POSIXLY_CORRECT
为1。这不起作用。我必须链接
html
到网站ftproot/mysite
而不是相反,因为 ftp 用户的访问模式很奇怪。这家伙修改的
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(星号)将会扩展。
注意事项
- 我建议
cp
用echo
(或-Rf
用-Ri
) 替换以确保 find 能够满足您的预期。 - 如果不知道确切的目录结构和 DEST 中的符号链接,我无法保证我预见到了所有可能的异常情况。