rsync:我怎样才能configuration它在服务器上创build目标目录?

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

我怎样才能做到这一点?

如果你创build的最后一个叶子目录不止一个,你可以先运行一个单独的ssh ... mkdir -p ,或者使用--rsync-path技巧,如下所示:

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

或者按照Tony的build议使用--relative选项。 在这种情况下,您只能指定必须存在的目标的根目录,而不是要创build的源的目录结构:

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

这样,你将以/ pre_existing / dir / new / x / y / z /

假设你使用ssh来连接rsync,那么之前要发送一个ssh命令呢?

 ssh user@server mkdir -p existingdir/newdir 

如果它已经存在,什么都不会发生

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

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

这对我工作:

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

我得到这个消息:

 skipping non-regular file "null" 

但我不必担心有一个空的目录在附近。

我不认为你可以用一个rsync命令来完成,但你可以像这样预先创build额外的目录:

 rsync --recursive emptydir/ destination/newdir 

'emptydir'是一个本地空目录(你可能必须先创build一个临时目录)。

这有点破解,但对我有用。

干杯

克里斯

这个答案使用了一些其他的答案,但希望对于情况会更清楚一些。 你从来没有指定你正在rsyncing – 一个目录条目或多个文件。

所以,让我们假设你正在移动一个目录条目,而不是仅仅移动文件。

假设你有一个本地名为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/ 

它会在远程机器上为你创buildmyappdata目录来放置你的文件。同样, data/目录必须存在于远程机器上。

顺便说一下,我使用-rvv标志是为了得到双重冗长的输出,所以清楚它的作用,以及必要的recursion行为。

只是为了向您展示我使用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 

希望这个清除一点点。

我没有足够的代表评论。

由@mivk提供的答案有一个陷阱,因为它是在我的浏览器中显示的卷起的引号,当逐字地复制时它将不起作用。 请修改为:

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

例如:

来自:/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 /