我想从本地计算机到服务器执行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/。
- 我正在访问的服务器没有mkdir,所以我使用的是hack:--rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \,它确实创建了一个额外的文件,但您可以稍后删除。
- 这似乎不适用于较新的rsync协议,当在scp命令中使用&;&;or;in--rsync path无效字符时,我会得到一个类似以下的错误!这里:&;&;/usr/bin/rsync
- @吉泰斯,你有没有试图逃离埃多克斯?
- @菲利皮尔瓦雷斯是的,我有,但没有工作。我现在找不到链接,但是一些文档说这是固定的,因为我相信它可以(并且已经)被利用。
- 谢谢,这行。在我的例子中,我在一个远程服务器上运行一个本地bash脚本,在这个脚本中运行正在执行的ssh mkdir命令,但是在运行rsync命令之前杀死了脚本的其余部分。这允许脚本的其余部分无问题地运行。
- @米夫克,这不能解决我的问题。你能看看这个问题吗?
- 令我感到困惑的是,以下的一个结果与rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/的效果相同,而不是rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/:rsync -a /new/x/y/z/ user@remote:/pre_existing/dir/y。所以不需要--relative或--rsync_path,y只是由rsync创建的。还是只在本地工作,没有遥控器(我就是这么做的)?为什么?
假设您使用ssh连接rsync,那么在以下情况之前发送ssh命令会怎么样:
1
| ssh user@server mkdir -p existingdir/newdir |
如果它已经存在,什么都不会发生
- UFK请求的语法将导致"rsync在服务器上创建[丢失的目标]目录[复制文件]。"您的响应有效,因为它将在服务器上创建丢失的目标目录…但不是用rsync,因此,没有答案。
- 如果不支持ssh,并且rsync连接到远程端的rsync daemon,则这不是一个选项。
-R, --relative选项将实现这一点。
例如:如果您想备份/var/named/chroot并在远程服务器上创建相同的目录结构,那么-R就可以做到这一点。
- 您还可以只指定要在源路径中使用/./创建的路径的一部分。有关详细信息,请参见手册页。
- 为什么要投票?答案是错误的,如果目标文件夹不存在,rsync将不会自动创建目录。叹息。
- 我强烈建议读者查看--relative的主页。它可能不会像你想的那样。
- --relative将完整路径(而不是文件)粘贴到您在服务器上提供的端点。通常/tmp/foo/bar/file.c到remote:/tmp会生成remote:/tmp/file.c,但使用-r它会创建/tmp/foo/bar/file.c。不要使用此选项,除非您知道自己在做什么,否则会得到一个非常混乱的目录结构。
- @Marki555的评论是成功的关键。--relative和/./是大多数新生儿将要寻找的。rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/将桌面内容复制到目标桌面。不知道用户名之间的差异会如何影响这一点。
- @Zeekvfu,正确答案是什么?
- @iulianoofrei您可以通过ssh在rsync之前在远程机器上执行命令(例如创建目录)。检查:stackoverflow.com/questions/305035/…
- @Zeekvfu,好吧,我的用例与问题不同,我想要一个zshrc函数(一行程序)在一个不存在的文件夹中备份一个文件。
- @我可能不够清楚。ssh user@host"mkdir -p /tmp/hello.world" && rsync -arvz file_name user@host:/tmp/hello.world之类的。需要ssh公钥身份验证。
- @zeekvfu,如stackoverflow.com/questions/1636889/…中所述,根据unix.stackexchange.com/a/496181/5783,由于rsync2.6.7,如果使用.锚定要在目的地创建的起始父目录,--relative将在远程端创建丢失的目录组件。请访问stackoverflow.com/a/55231772/107158查看我的答案。
这对我很有用:
1
| rsync /dev/null node:existing-dir/new-dir/ |
我确实收到这个消息:
1
| skipping non-regular file"null" |
但我不必担心有一个空的目录挂在周围。
- 这是可行的。你需要斜杠。
- 谢谢你的回答。效果很好。所以,如果我想把同步的文件保存在我指向的文件夹中作为源文件,那么我只需要指定它,它就会被创建。例如:rsync-avph/mytest//otherfolder/mytest/然后我得到输出"created directory/otherfolder/mytest"
我不认为你可以用一个rsync命令来完成它,但是你可以像这样先"预创建"额外的目录:
1
| rsync --recursive emptydir/ destination/newdir |
其中"emptydir"是本地空目录(您可能需要先将其创建为临时目录)。
有点像黑客,但对我有用。
干杯
克里斯
- 不需要使用临时文件夹。见上述rsync /dev/null node:existing-dir/new-dir/建议。
这个答案使用了一些其他的答案,但希望它在环境方面会更清楚一点。您从未指定要同步的内容-单个目录条目或多个文件。
所以假设您正在移动一个源目录条目,而不仅仅是移动其中包含的文件。
假设您有一个本地名为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 |
希望这能让情况好转一点。
- 这并不完全符合预期。我尝试了第一个命令rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdata,但它在目标上创建的是/remote/path/to/data/myappdata/myappdata/
- 如果我对您的第一个命令做了一个微小的更改,并在源路径后面添加了一个斜线"/",那么它的工作方式……就像这样:rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata。
如:
发件人:/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/