rsync - 创建所有缺少的父目录?

时间:2013-08-28 15:01:32

标签: rsync scp

我正在寻找一个类似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。 (注意 - 包含必须在排除之前。)

还有其他选择吗?

7 个答案:

答案 0 :(得分:18)

您可能正在寻找

rsync -aR

例如:

rsync -a --relative /top/a/b/c/d remote:/

请参阅other question中的这个技巧。

答案 1 :(得分:12)

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可执行文件的路径。

答案 2 :(得分:7)

我建议你手动强制存在:

ssh user@remote mkdir -p /top/a/b/c
rsync /top/a/b/c/d remote:/top/a/b/c

如果目标文件夹不存在,则会创建目标文件夹。

答案 3 :(得分:1)

--relative对我不起作用,因为我有不同的设置。 也许我只是不明白--relative是如何运作的,但我发现了

ssh remote mkdir -p /top/a/b/c
rsync /top/a/b/c/d remote:/top/a/b/c

易于理解并完成工作。

答案 4 :(得分:1)

我一直在寻找更好的解决方案,但是当你有太多的子目录来手动创建它时,我似乎更适合。

只需使用cp作为--parents选项

的中间步骤
cp --parents /your/path/sub/dir/ /tmp/localcopy
rsync [options] /tmp/localcopy/* remote:/destination/path/

cp --parents将为您创建结构。

如果您只想复制父文件夹的一个子集,则可以从任何子文件夹中调用它。

答案 5 :(得分:1)

根据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

答案 6 :(得分:0)

在Linux中创建rsync目标路径的一种较短方法是使用'$ _'特殊变量。 (我认为但无法确认,在OSX中也是如此)。

'$ _'保存前一条命令的最后一个参数的值。因此,可以通过以下方式回答问题:

ssh remote mkdir -p /top/a/b/c/ && rsync -avz /top/a/b/c/d remote:$_

相关问题