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

时间:2009-10-28 12:16:33

标签: rsync

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

我该怎么做?

9 个答案:

答案 0 :(得分:125)

如果您要创建的是最后一个叶子目录,则可以先单独运行ssh ... mkdir -p,也可以--rsync-path使用rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/ 技巧作为explained here

--relative

或使用Tony建议的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/ 开始的位置:

{{1}}

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

答案 1 :(得分:32)

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

ssh user@server mkdir -p existingdir/newdir

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

答案 2 :(得分:14)

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

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

答案 3 :(得分:13)

这对我有用:

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

我收到此消息:

skipping non-regular file "null"

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

答案 4 :(得分:4)

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

rsync --recursive emptydir/ destination/newdir

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

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

欢呼声

克里斯

答案 5 :(得分: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/目录。

顺便说一句,我对-rvv标志的使用是为了获得双倍冗长的输出,因此很明显它的作用以及必要的递归行为。

向您展示使用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

希望这会稍微澄清一下。

答案 6 :(得分:2)

例如:

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

to: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 /

答案 7 :(得分:0)

rsync source.pdf user1@192.168.56.100:~/not-created/target.pdf

如果完全指定了目标文件,则不会创建目录 ~/not-created

rsync source.pdf user1@192.168.56.100:~/will-be-created/

但是target只指定了一个目录,创建了目录~/will-be-created。必须遵循 / 才能让 rsync 知道 will-be-created 是一个目录。

答案 8 :(得分:0)

使用 rsync 两次~

1:传输临时文件,确保远程相对目录已经创建。

tempfile=/Users/temp/Dir0/Dir1/Dir2/temp.txt
# Dir0/Dir1/Dir2/ is directory that wanted.
rsync -aq /Users/temp/ rsync://remote

2: 然后就可以指定远程传输文件的目录/目录

tempfile|dir=/Users/XX/data|/Users/XX/data/
rsync -avc /Users/XX/data rsync://remote/Dir0/Dir1/Dir2
# Tips: [SRC] with/without '/' is different