我想rsync
从本地计算机到服务器。在一个不存在的目录上,我希望 rsync
首先在服务器上创建该目录。
我怎样才能做到这一点?
如果要创建的叶目录不止最后一个,则可以先运行单独的 ssh ... mkdir -p
,或者将 --rsync-path
技巧用作 explained here:
rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/
或者按照 Tony 的建议使用 --relative
选项。在这种情况下,您只需指定必须存在的目标的根目录,而不是将创建的源目录结构:
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/
将创建 /pre_existing/dir/y/z/。
假设你使用 ssh 连接 rsync,那么之前发送一个 ssh 命令怎么样:
ssh user@server mkdir -p existingdir/newdir
如果它已经存在,则什么都不会发生
rsync
,因此没有答案。
ssh
并且 rsync
连接到远程端的 rsync daemon
,则这不是一个选项。
从 rsync
手册页 (man rsync
):
--mkpath create the destination's path component
--relative
对语法进行任何奇怪的修改,您可以简单地在源路径和目标路径上留下一个斜杠,所有递归文件/文件夹将自动他们之间同步...
-R, --relative
选项将执行此操作。
例如:如果您要备份 /var/named/chroot
并在远程服务器上创建相同的目录结构,则 -R
将执行此操作。
/./
仅指定要创建的部分路径。有关详细信息,请参见手册页。
rsync
不会自动创建目录。叹。
--relative
的联机帮助页。它可能不会像你想的那样。
--relative
与 /./
是大多数新手会寻找的。 rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/
将桌面的内容复制到目标桌面。不知道用户名的差异如何影响这一点。
这对我有用:
rsync /dev/null node:existing-dir/new-dir/
我确实收到了这条消息:
skipping non-regular file "null"
但我不必担心会有一个空目录。
我不认为你可以用一个 rsync 命令来做到这一点,但你可以先“预先创建”额外的目录,如下所示:
rsync --recursive emptydir/ destination/newdir
其中 'emptydir' 是本地空目录(您可能必须先将其创建为临时目录)。
这有点像黑客,但它对我有用。
干杯
克里斯
rsync /dev/null node:existing-dir/new-dir/
建议。
这个答案使用了其他一些答案,但希望它会更清楚地了解情况。您从未指定要同步的内容 - 单个目录条目或多个文件。
因此,假设您正在移动一个源目录条目,而不仅仅是移动其中包含的文件。
假设您在本地有一个名为 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
希望这能澄清一点。
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
同步:
cd /xxx/a/ && rsync -auvR b/c/d/e/ user@remote:/pre_existing/dir/
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/
但是目标只指定了一个目录,目录 ~/will-be-created
被创建。必须遵循 /
才能让 rsync 知道 will-be-created
是一个目录。
使用 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
这会在目标中创建目录树 /usr/local/bin
,然后递归同步所有包含的文件和文件夹:
rsync --archive --include="/usr" --include="/usr/local" --include="/usr/local/bin" --include="/usr/local/bin/**" --exclude="*" user@remote:/ /home/user
与 mkdir -p
相比,目录树甚至具有与源相同的权限。
如果您使用的版本或 rsync 没有“mkpath”,那么 --files-from 可以提供帮助。假设您需要在目标目录中创建“mysubdir”
创建“filelist.txt”以包含 mysubdir/dummy
mkdir -p source_dir/mysubdir/
touch source_dir/mysubdir/dummy
rsync --files-from='filelist.txt' source_dir target_dir
rsync 会将 mysubdir/dummy 复制到 target_dir,在此过程中创建 mysubdir。在 Raspberry Pi OS (debian) 上使用 rsync 3.1.3 进行测试。
mkdir
,所以我使用了 hack:--rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \
它确实创建了一个额外的文件,但您可以稍后删除。&&
?