63

我正在寻找一个rsync类似 - 的程序,它将在远程端创建任何缺少的父目录。

例如,如果我/top/a/b/c/d在一台服务器上并且只/top/a存在于远程服务器上,我想复制d到远程服务器并创建bc目录。

命令:

rsync /top/a/b/c/d remote:/top/a/b/c

将不起作用,因为/tmp/a/b远程服务器上不存在。如果它确实存在,那么文件d将被复制到 path /top/a/b/c

这可以通过rsync使用--include--exclude开关来完成,但它非常复杂,例如:

rsync -v -r a dest:dir  \
  --include 'a/b'       \
  --include 'a/b/c'     \
  --include 'a/b/c/d'   \
  --include 'a/b/c/d/e' \
  --exclude 'a/*'       \
  --exclude 'a/b/*'     \
  --exclude 'a/b/c/*'   \
  --exclude 'a/b/c/d/*' 

即使中间目录有文件,也只会复制a/b/c/d/e到。dest:dir/a/b/c/d/e(注意 - 包含必须在排除之前。)

还有其他选择吗?

4

7 回答 7

29

您可能正在寻找

rsync -aR

例如:

rsync -a --relative /top/a/b/c/d remote:/

另请参阅其他问题中的这个技巧。

于 2014-04-01T23:13:19.167 回答
15
rsync -aq --rsync-path='mkdir -p /tmp/imaginary/ && rsync' file user@remote:/tmp/imaginary/

http://www.schwertly.com/2013/07/forcing-rsync-to-create-a-remote-path-using-rsync-path/,但不要从那里复制和粘贴,他的语法被屠杀了.

它允许您执行任意命令来设置 rsync 可执行文件的路径。

于 2014-12-23T18:41:41.020 回答
9

我建议您手动强制存在:

ssh user@remote mkdir -p /top/a/b/c
rsync /top/a/b/c/d remote:/top/a/b/c

如果目标文件夹不存在,这将创建它。

于 2013-08-30T10:11:45.893 回答
6

根据https://unix.stackexchange.com/a/496181/5783,从 rsync 2.6.7 开始,--relative如果您使用.锚定起始父目录以在目的地创建:

derek@DESKTOP-2F2F59O:~/projects/rsync$ mkdir --parents top1/a/b/c/d
derek@DESKTOP-2F2F59O:~/projects/rsync$ mkdir --parents top2/a
derek@DESKTOP-2F2F59O:~/projects/rsync$ rsync --recursive --relative --verbose top1/a/./b/c/d top2/a/
sending incremental file list
b/
b/c/
b/c/d/

sent 99 bytes  received 28 bytes  254.00 bytes/sec
total size is 0  speedup is 0.00
于 2019-03-18T23:56:39.093 回答
2

我一直在寻找更好的解决方案,但是当您有太多子目录无法手动创建它们时,我的解决方案似乎更适合。

只需使用选项cp作为中间步骤--parents

cp --parents /your/path/sub/dir/ /tmp/localcopy
rsync [options] /tmp/localcopy/* remote:/destination/path/

cp --parents将为您创建结构。

如果您只想复制父文件夹的一个子集,则可以从任何子文件夹调用它。

于 2017-10-17T18:20:26.283 回答
1

--relative对我不起作用,因为我有不同的设置。也许我只是不明白它是如何--relative工作的,但我发现

ssh remote mkdir -p /top/a/b/c
rsync /top/a/b/c/d remote:/top/a/b/c

很容易理解并且可以完成工作。

于 2016-03-16T11:46:57.353 回答
0

在 Linux 中创建 rsync 目标路径的一种更短的方法是使用“$_”特殊变量。(我认为,但无法确认,在 OSX 中也是如此)。

'$_' 保存上一个执行命令的最后一个参数的值。所以这个问题可以这样回答:

ssh remote mkdir -p /top/a/b/c/ && rsync -avz /top/a/b/c/d remote:$_

于 2020-05-13T14:33:55.017 回答