【问题标题】:Rsync Copies Whole Directory Content Instead of Single FileRsync 复制整个目录内容而不是单个文件
【发布时间】:2016-04-18 20:46:13
【问题描述】:

我在使用 rsync 命令时遇到了问题,该命令正在执行我没想到的额外工作。下面的命令应该只将 single 文件同步到目标服务器的目录。

但是,即使我尝试 --exclude 该目录中的所有其他文件,它也会将额外文件从 ${OUT_DIR}/make 目录复制到目标位置。

如何让 rsync 只复制目标文件?

eval rsync -azu --delete \
--include ${OUT_DIR}/make/file.mk \
--exclude ${OUT_DIR}/make \
${OUT_DIR}/make/file.mk
${DEST_USER}@${DEST_SVR}:$OUT_DIR_DEST/make

我已经尝试删除“额外”选项,但这样做时遇到了错误,因此尝试使上面的命令正常工作似乎是最好的做法。但是,当我尝试对其进行更改时,我得到了以下结果:

eval rsync \
${OUT_DIR}/make/file.mk
${DEST_USER}@${DEST_SVR}:$OUT_DIR_DEST/make

Incompatible options specified for inc-recursive connection.
rsync error: syntax or usage error (code 1) at compat.c(268) [sender=3.0.6]

删除 --delete 相关选项:

eval rsync -azu
${OUT_DIR}/make/file.mk
${DEST_USER}@${DEST_SVR}:$OUT_DIR_DEST/make

opening connection using: ssh -x -i ... rsync --server -vvulogDtprze.iLs . 

$OUT_DIR_DEST/make 
note: iconv_open("UTF-8", "UTF-8") succeeded.
(Client) Protocol versions: remote=30, negotiated=30
sending incremental file list
[sender] make_file(file.mk,*,0)
[sender] flist start=1, used=1, low=0, high=0
[sender] i=1 /OUTDIR/path file.mk mode=0100664 len=91 uid=300 gid=301 flags=5
send_file_list done
file list sent
send_files starting
ERROR: buffer overflow in recv_rules [receiver]
rsync error: error allocating core memory buffers (code 22) at util.c(123) [receiver=3.0.6]
rsync: connection unexpectedly closed (9 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(600) [sender=3.0.6]
_exit_cleanup(code=12, file=io.c, line=600): entered
_exit_cleanup(code=12, file=io.c, line=600): about to call exit(12)

我所做的大部分谷歌搜索都没有找到任何明显的解决方案。

【问题讨论】:

  • 你为什么认为你需要所有这些论点?
  • 如果我删除 --delete 选项,我会收到一条错误消息,指出“错误:recv_rules 中的缓冲区溢出”。如果我在没有参数的情况下设置它,我会收到错误“为 inc-recursive 连接指定的不兼容选项”
  • 并不是我“相信”我需要它们。我想摆脱它们,但是,这样做只会导致更多问题。请参阅上面的更新说明...
  • $OUT_DIR 包含什么?
  • 本地目录的规范路径和 $OUT_DIR_DEST 是远程目录的不同规范路径

标签: linux shell command-line rsync


【解决方案1】:

我将忽略 eval 业务,因为其中的任何额外扩展都不清楚,但我可以向您展示 rsync 应该是什么样子。如果您使用的是 bash 或 zsh,那么您可以执行 set -x,它会向您显示它运行的命令真正在变量扩展后的样子。

最简单的解决办法是这样的:

rsync -azu \
   /local/path/to/make/file.mk \
   user@server:/remote/path/to/make/

如果您真的想使用包含/排除规则(如果有多个包含,可能会很好),然后这样做:

rsync -azu \
   --include=file.mk \
   --exclude='*' \
   /local/path/to/make/ \
   user@server:/remote/path/to/make/

--include 模式是相对于源目录的根目录,所以如果你说--include=/local/path/to/make/file.mk,那么该模式将只匹配一个名为/local/path/to/make/local/path/to/make/file.mk 的文件,这显然不是你的意思。

--exclude 规则的工作方式相同,所以基本上你告诉它排除不存在的东西,所以什么都没有被排除。 --exclude='*' 表示排除所有内容(尚未明确包含的内容),因此您不会收到类似的错误。

您可以使用--relative 选项更改这些规则。我认为这可能会使您的原始命令起作用,但它会在远程系统上创建文件:/remote/path/to/make/local/path/to/make/file.mk

无论你怎么做,包含规则都需要在排除规则之前:rsync 使用匹配任何给定文件或目录的 first 规则。


您发布的错误消息表明远程计算机内存不足:

ERROR: buffer overflow in recv_rules [receiver]
rsync error: error allocating core memory buffers (code 22) at util.c(123) [receiver=3.0.6]

内存使用在 3.0 中得到了极大的改善,但您似乎拥有 3.0.6,所以大概这不是您可以解决的问题。尝试新版本(我有 3.1.2)可能不是一个糟糕的计划。

如果该文件夹下有很多文件(除了一个除外),那么您可以通过避免递归选项来节省内存:

rsync -ptgo -zu \
   /local/path/to/make/file.mk \
   user@server:/remote/path/to/make/

我所做的只是将-a 替换为等效的-rlptgoD,然后删除了不必要的选项,尤其是-r

如果一切都失败了,您可以尝试在该机器上添加交换文件。

【讨论】:

  • 很好的解释。我认为这应该可以正常工作,但我仍然收到停止传输ERROR: buffer overflow in recv_rules [receiver] 的错误。我认为 SSH 或两台机器之间的 rsync 有问题。虽然 Rsync 和 SSH 版本在每一侧都是相同的,所以我不确定是什么导致了 recv_rules 问题。
  • 您的远程计算机似乎内存不足?
  • 我不这么认为。我认为这与服务器端的这条特定行有关:rsync --server -logDtprze.iLs --delete . $ROOTDIR。我认为由于这个接收者规则,发送者和接收者不同意正在发送的命令。
  • 不过,可能值得更新到更新的 rsync
  • 我希望它是那么简单。双方已经在使用最新的 3.0.6 并且在连接时协商相同的协议=30。
猜你喜欢
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多