我想rsync
从本地计算机到服务器。在不存在的目录上,我希望rsync
首先在服务器上创建该目录。
我该怎么做?
答案 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