Linux Rsync复制整个目录内容,而不是单个文件

Linux Rsync复制整个目录内容,而不是单个文件,linux,shell,command-line,rsync,Linux,Shell,Command Line,Rsync,我遇到了rsync命令的问题,该命令正在执行我不期望的额外工作。下面的命令应该只将单个文件rsync到目标服务器的目录 但是,它正在将额外文件从${OUT\u DIR}/make目录复制到目标中,即使我试图从该目录中排除所有其他文件 如何使rsync仅复制目标文件 eval rsync -azu --delete \ --include ${OUT_DIR}/make/file.mk \ --exclude ${OUT_DIR}/make \ ${OUT_DIR}/make/file.mk ${

我遇到了rsync命令的问题,该命令正在执行我不期望的额外工作。下面的命令应该只将单个文件rsync到目标服务器的目录

但是,它正在将额外文件从
${OUT\u 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]
删除--删除相关选项:

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)

我所做的大多数谷歌搜索都没有为这两个问题找到任何明显的解决方案。

我将省略
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/
如果您真的想使用包含/排除规则(如果有多个包含,可能很好),请按如下方式操作:

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

无论如何,include规则必须在exclude规则之前:rsync使用与任何给定文件或目录匹配的第一个规则


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

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


如果所有其他操作都失败,您可以尝试在该计算机上添加一个交换文件。

为什么您认为需要所有这些参数?如果删除--delete选项,则会出现一个错误,说明“error:recv_rules中的缓冲区溢出”。如果我在没有参数的情况下设置它,我会得到错误“inc recursive connection指定的不兼容选项”,这并不是因为我“相信”我需要它们。我想摆脱他们,但是,这样做只会导致更多的问题。请参阅上面更新的说明。
$OUT\u DIR
包含什么?本地目录的规范路径,$OUT\u DIR\u DEST是远程目录的另一个规范路径很好的解释。我认为这应该可以正常工作,但我仍然收到一个错误,它正在停止传输
错误:recv_rules[receiver]
中的缓冲区溢出。我认为这两台机器之间的SSH或rsync有问题。但是Rsync和SSH版本在每一方都是相同的,所以我不确定是什么导致了recv_规则问题。看起来您的远程机器可能已经耗尽了RAM?我不这么认为。我认为这与服务器端的这一行有关:
rsync--server-logDtprze.iLs--delete$ROOTDIR
。我认为由于这个接收方规则,发送方和接收方对发送的命令不一致。不过,可能值得更新到一个更新的rsyncI,希望它能这么简单。双方已经在使用最新的3.0.6,并在连接时协商相同的协议=30。