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

rsync: how can I configure it to create target directory on server?

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

我该怎么做?


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

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

或者按照托尼的建议使用--relative选项。在这种情况下,您只指定目标的根目录(必须存在),而不指定将创建的源目录结构:

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

这样,您将以/pre_existing/dir/new/x/y/z结尾/

如果您想创建"y/z/",但不想在"new/x/"中创建,您可以将./添加到希望--relative开始的位置:

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

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


假设您使用ssh连接rsync,那么在以下情况之前发送ssh命令会怎么样:

1
ssh user@server mkdir -p existingdir/newdir

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


-R, --relative选项将实现这一点。

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


这对我很有用:

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

我确实收到这个消息:

1
skipping non-regular file"null"

但我不必担心有一个空的目录挂在周围。


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

1
rsync --recursive emptydir/ destination/newdir

其中"emptydir"是本地空目录(您可能需要先将其创建为临时目录)。

有点像黑客,但对我有用。

干杯

克里斯


这个答案使用了一些其他的答案,但希望它在环境方面会更清楚一点。您从未指定要同步的内容-单个目录条目或多个文件。

所以假设您正在移动一个源目录条目,而不仅仅是移动其中包含的文件。

假设您有一个本地名为data/myappdata/的目录,并且在该目录下有一堆子目录。您的目标机器上有data/,但没有data/myappdata/-这很容易:

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

甚至可以对远程目录使用不同的名称:

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

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

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

它将在远程机器上为您创建一个myappdata目录,以放置您的文件。同样,远程机器上必须存在data/目录。

顺便说一下,我使用-rvv标志是为了获得双倍的详细输出,这样就可以清楚地了解它的作用,以及必要的递归行为。

只是为了告诉你我在使用rsync时得到了什么(Ubuntu12.04上的3.0.9)

1
2
3
4
5
6
7
8
9
$ rsync -rvv *.txt [email protected]:/tmp/newdir/
opening connection using: ssh -l user remote.machine rsync --server -vvre.iLsf . /tmp/newdir/
[email protected]'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

希望这能让情况好转一点。


如:

发件人:/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/