我正在寻找一个类似rsync
的程序,它将在远程端创建任何缺少的父目录。
例如,如果我在一台服务器上有/top/a/b/c/d
并且远程服务器上只存在/top/a
,我想将d
复制到远程服务器并创建b
和c
目录。
命令:
rsync /top/a/b/c/d remote:/top/a/b/c
将无法正常工作,因为远程服务器上不存在/tmp/a/b
。如果它确实存在,那么文件d
将被复制到路径/top/a/b/c
。
这可能与使用rsync
和--include
开关的--exclude
有关,但它非常复杂,例如:
rsync -v -r a dest:dir \
--include 'a/b' \
--include 'a/b/c' \
--include 'a/b/c/d' \
--include 'a/b/c/d/e' \
--exclude 'a/*' \
--exclude 'a/b/*' \
--exclude 'a/b/c/*' \
--exclude 'a/b/c/d/*'
即使中间目录有文件,也只会将a/b/c/d/e
复制到dest:dir/a/b/c/d/e
。 (注意 - 包含必须在排除之前。)
还有其他选择吗?
rsync -aq --rsync-path='mkdir -p /tmp/imaginary/ && rsync' file user@remote:/tmp/imaginary/
从http://www.schwertly.com/2013/07/forcing-rsync-to-create-a-remote-path-using-rsync-path/,但不要从那里复制和粘贴,他的语法被屠杀。
它允许您执行任意命令来设置rsync可执行文件的路径。
我建议您手动执行存在:
ssh user@remote mkdir -p /top/a/b/c
rsync /top/a/b/c/d remote:/top/a/b/c
如果目标文件夹不存在,则会创建目标文件夹。
--relative
不适合我,因为我有不同的设置。也许我只是不明白--relative
是如何工作的,但我发现了
ssh remote mkdir -p /top/a/b/c
rsync /top/a/b/c/d remote:/top/a/b/c
很容易理解并完成工作。
我正在寻找一个更好的解决方案,但是当你有太多的子目录手动创建它时,我似乎更适合。
只需使用cp
作为--parents
选项的中间步骤
cp --parents /your/path/sub/dir/ /tmp/localcopy
rsync [options] /tmp/localcopy/* remote:/destination/path/
cp --parents
将为您创建结构。
如果只想复制父文件夹的一个子集,则可以从任何子文件夹中调用它。
根据https://unix.stackexchange.com/a/496181/5783,自rsync 2.6.7起,--relative
可以使用.
来锚定在目的地创建的起始父目录:
derek@DESKTOP-2F2F59O:~/projects/rsync$ mkdir --parents top1/a/b/c/d
derek@DESKTOP-2F2F59O:~/projects/rsync$ mkdir --parents top2/a
derek@DESKTOP-2F2F59O:~/projects/rsync$ rsync --recursive --relative --verbose top1/a/./b/c/d top2/a/
sending incremental file list
b/
b/c/
b/c/d/
sent 99 bytes received 28 bytes 254.00 bytes/sec
total size is 0 speedup is 0.00