rsync:如何配置它以在服务器上创建目标目录?


142

我想rsync从本地计算机到服务器。在一个不存在的目录上,我要rsync目录上首先在服务器上创建该目录。

我怎样才能做到这一点?

Answers:


161

如果要创建的目录目录比最后一个目录目录多,可以ssh ... mkdir -p先运行一个单独的目录,也可以--rsync-path按照以下说明操作

rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/

或使用--relativeTony建议的选项。在这种情况下,您仅指定目的地的根(必须存在),而不指定将要创建的源的目录结构:

rsync -a --relative /new/x/y/z/ user@remote:/pre_existing/dir/

这样,您将最终获得/ pre_existing / dir / new / x / y / z /

如果要创建“ y / z /”,而不要在“ new / x /”内部,则可以添加./--relative开始的位置:

rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/

将创建/ pre_existing / dir / y / z /。


2
我正在访问的服务器没有mkdir,所以我正在使用hack:--rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \它确实创建了一个额外的文件,但您以后可以删除。
法比亚诺·索里亚尼

1
这似乎不适用于更新的rsync协议,当使用&&或;时出现类似于以下的错误。--rsync-path 中的scp命令中的无效字符!此处:&& / usr / bin / rsync
ghitesh

@ghitesh您是否试图逃脱&&
费利佩·阿尔瓦雷斯

@FelipeAlvarez是的,但没有成功。我现在无法找到该链接,但是一些文档说它是固定的,因为我认为它可以(并且曾经)被利用。
ghitesh

谢谢,这有效。在我的情况下,我在远程服务器上运行本地bash脚本,并且在其中运行正在执行的ssh mkdir命令,但随后在运行rsync命令之前杀死了脚本的其余部分。这使得脚本的其余部分可以正常运行。
johndavid400

33

假设您正在使用ssh连接rsync,那么在发送ssh命令之前该怎么做:

ssh user@server mkdir -p existingdir/newdir

如果已经存在,则什么也不会发生


4
ufk的请求使用的语法将导致“ rsync在服务器上创建[缺少目标]目录[&&复制文件]。” 您的响应是有效的,因为它将在服务器上创建丢失的目标目录...但不能使用rsync,因此没有答案。
TomRoche 2015年

如果ssh不支持,则不是一个选项,它rsync连接到rsync daemon远程端上的。
KrzysztofJabłoński'18

19

-R, --relative选项将执行此操作。

例如:如果要备份/var/named/chroot并在远程服务器上创建相同的目录结构,则-R只需执行此操作。


12
您也可以仅/./在源路径中使用来指定要创建的路径的一部分。有关详细信息,请参见手册页。
Marki555 2013年

20
为什么要投票?答案是错误的,rsync如果目标文件夹不存在,则不会自动创建目录。叹。
zeekvfu

3
我强烈建议读者检查的联机帮助页--relative。它可能不会按照您的想法做。
FiloSottile 2014年

3
--relative将完整路径而不是文件粘贴在您在服务器上提供的端点上。通常/tmp/foo/bar/file.c到remote:/ tmp会产生remote:/tmp/file.c,但是使用-R会创建/tmp/foo/bar/file.c除非您使用此选项知道您在做什么,您将获得一个非常混乱的目录结构。
Cormac Mulhall 2014年

7
@ Marki555的评论是成功的关键。--relative/./大多数新手将寻找的东西结合在一起。rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/会将桌面内容复制到目标桌面。不知道用户名的不同会如何影响这一点。
Daniel F

15

这为我工作:

 rsync /dev/null node:existing-dir/new-dir/

我确实收到此消息:

skipping non-regular file "null"

但我不必担心周围会有一个空目录。


感谢您的回答kdubs。效果很好。因此,如果我想将要同步的文件保留在指向其作为源的文件夹中,则只需指定它即可创建它。例如:rsync -avph / mytest / / otherfolder / mytest /然后我得到输出“创建的目录/ otherfolder / mytest”
mbrinson 2014年

1
不要忘记new-dir末尾的斜杠('/'),否则它将创建一个非目录文件。
tartaruga_casco_mole

4

我不认为您可以使用一个rsync命令来做到这一点,但是您可以像这样先“预先创建”额外的目录:

rsync --recursive emptydir/ destination/newdir

其中“ emptydir”是本地空目录(您可能必须首先将其创建为临时目录)。

这有点hack,但是对我有用。

干杯

克里斯


无需使用临时文件夹。参见rsync /dev/null node:existing-dir/new-dir/上面的建议。
lucid_dreamer '18

3

该答案使用了其他答案,但希望情况会更清楚一些。您从未指定要同步的内容-一个目录条目或多个文件。

因此,假设您要遍历整个源目录条目,而不仅仅是移动其中包含的文件。

假设您有一个本地调用的目录,data/myappdata/并且在此目录下有很多子目录。您data/在目标计算机上,但没有data/myappdata/-这很容易:

rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata

您甚至可以为远程目录使用其他名称:

rsync -rvv --recursive /path/to/data/myappdata user@host:/remote/path/to/data/newdirname

如果您只是移动一些文件而不移动包含它们的目录条目,则可以执行以下操作:

rsync -rvv /path/to/data/myappdata/*.txt user@host:/remote/path/to/data/myappdata/

它将myappdata在远程计算机上为您创建用于放置文件的data/目录。同样,该目录必须在远程计算机上存在。

顺便说一句,我使用-rvvflag是为了获得双重详细输出,因此很清楚它的作用以及必要的递归行为。

只是为了向您展示使用rsync时得到了什么(在Ubuntu 12.04上为3.0.9)

$ rsync -rvv *.txt user@remote.machine:/tmp/newdir/
opening connection using: ssh -l user remote.machine rsync --server -vvre.iLsf . /tmp/newdir/
user@remote.machine's password:
sending incremental file list
created directory /tmp/newdir
delta-transmission enabled
bar.txt
foo.txt
total: matches=0  hash_hits=0  false_alarms=0 data=0

希望这可以解决这一点。


这不能完全按预期工作。我尝试了第一个命令,rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdata但在目标上创建的是/ remote / path / to / data / myappdata / myappdata /
harleygolfguy

如果我对您的第一个命令稍作更改,并在源路径后添加斜杠“ /”,则它的工作原理如下: rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
harleygolfguy 2016年

2

例如:

来自:/xxx/a/b/c/d/e/1.html

到:user @ remote:/pre_existing/dir/b/c/d/e/1.html

rsync:

cd / xxx / a / && rsync -auvR b / c / d / e / user @ remote:/ pre_existing / dir /

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.