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

ufk*_*ufk 127 rsync

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

我怎样才能做到这一点?

miv*_*ivk 135

如果您要创建的是最后一个叶子目录,则可以ssh ... mkdir -p先单独运行,也可以使用此处说明--rsync-path技巧:

rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/
Run Code Online (Sandbox Code Playgroud)

或者使用--relativeTony建议的选项.在这种情况下,您只需指定必须存在的目标的根,而不是将创建的源的目录结构:

rsync -a --relative /new/x/y/z/ user@remote:/pre_existing/dir/
Run Code Online (Sandbox Code Playgroud)

这样,你最终会得到/ pre_existing/dir/new/x/y/z /

如果你想创建"y/z /",但不想在"new/x /"里面,你可以添加./你想要--relative开始的地方:

rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/
Run Code Online (Sandbox Code Playgroud)

会创建/ pre_existing/dir/y/z /.

  • 我正在访问的服务器没有 `mkdir`,所以我使用了 hack:```--rsync-path="echo f > /public/.keep && rsync /public/.keep /public/ newfolder/ && rsync" \``` 它确实会创建一个额外的文件,但您可以稍后删除。 (2认同)

小智 32

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

ssh user@server mkdir -p existingdir/newdir
Run Code Online (Sandbox Code Playgroud)

如果已经存在,则没有任何反应

  • ufk的请求是用于导致"rsync在服务器上创建[缺少目标]目录[&& copy the files]"的语法.您的响应是有效的,因为它将在服务器上创建缺少的目标目录...但不是`rsync`,因此,没有答案. (4认同)

Ton*_*ony 16

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

例如:如果要/var/named/chroot在远程服务器上备份并创建相同的目录结构,那么-R就可以做到这一点.

  • 为什么要upvote?答案是错误的,如果目标文件夹不存在,`rsync`将不会自动创建目录.叹. (18认同)
  • 您还可以使用源路径中的`/./`指定要创建的部分路径.有关详细信息,请参见手册 (12认同)
  • @ Marki555的评论是成功的关键.`--relative`与`/./`一起是大多数新手都会寻找的东西.`rsync -avz -e ssh --progress --relative~ /./ Desktop/TARGET_IP:〜/`将桌面内容复制到目标桌面.不知道用户名的差异可能会如何影响这一点. (7认同)
  • 我强烈建议读者查看"--relative"的联机帮助页.它可能没有你想的那样做. (3认同)
  • --relative在您在服务器上提供的端点上粘贴完整路径而不是文件.通常/tmp/foo/bar/file.c到远程:/ tmp会生成remote:/tmp/file.c但是使用-R它会创建/tmp/foo/bar/file.c除非你使用此选项知道你在做什么,你会得到一个非常混乱的目录结构. (2认同)

kdu*_*ubs 13

这对我有用:

 rsync /dev/null node:existing-dir/new-dir/
Run Code Online (Sandbox Code Playgroud)

我收到这条消息:

skipping non-regular file "null"
Run Code Online (Sandbox Code Playgroud)

但我不必担心有一个空目录.

  • 这有效.仅供参考,你需要尾随斜线. (3认同)
  • 不要忘记 new-dir 末尾的斜杠('/'),否则会创建一个非目录文件。 (2认同)

Igo*_*gor 10

rsync手册页(man rsync):

--mkpath                 create the destination's path component
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此选项仅在版本 3.2.3(2020 年 8 月 6 日)中添加。 (7认同)
  • 晚十年总比不做好!这个标志是一个救星,你不必使用例如“--relative”和这个标志对语法进行任何奇怪的修改,你可以简单地在源路径和目标路径上留下一个尾部斜杠,所有递归文件/文件夹都会它们之间会自动同步... (2认同)
  • 令人震惊的是,这个失踪了这么久。 (2认同)

Chr*_*nis 6

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

rsync --recursive emptydir/ destination/newdir
Run Code Online (Sandbox Code Playgroud)

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

这有点黑客,但它对我有用。

干杯

克里斯