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

Eri*_*ikR 37 rsync scp

我正在寻找一个rsync类似程序,它将在远程端创建任何缺少的父目录.

例如,如果我/top/a/b/c/d在一台服务器上并且只/top/a存在于远程服务器上,我想复制d到远程服务器并创建bc目录.

命令:

rsync /top/a/b/c/d remote:/top/a/b/c
Run Code Online (Sandbox Code Playgroud)

将无法工作,因为/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/*' 
Run Code Online (Sandbox Code Playgroud)

即使中间目录有文件,也只会复制a/b/c/d/edest:dir/a/b/c/d/e.(注意 - 包含必须在排除之前.)

还有其他选择吗?

RaZ*_*0rr 23

版本 3.2.3(2020 年 8 月 6 日)开始,rynsc有一个用于此目的的标志。

rsync手册页(man rsync):

--mkpath                 create the destination's path component
Run Code Online (Sandbox Code Playgroud)


Bal*_*alu 19

你可能正在寻找

rsync -aR
Run Code Online (Sandbox Code Playgroud)

例如:

rsync -a --relative /top/a/b/c/d remote:/
Run Code Online (Sandbox Code Playgroud)

另见其他问题.

  • `--relative`不会像问题那样_create_丢失远程端的目录组件. (3认同)
  • 对我不起作用,抱怨`rsync:mkdir"/ home/constantine/Projects/schifra-pkg/pkg/schifra-git/usr/include/schifra"失败:没有这样的文件或目录` (3认同)
  • @juzzlin,根据 https://unix.stackexchange.com/a/496181/5783,从 `rsync` 2.6.7 开始,如果你使用 `.` ,`--relative` 将在远程端创建缺失的目录组件锚定要在目的地创建的起始父目录。请参阅我在 /sf/answers/3866224071/ 上的回答。 (3认同)
  • 为什么还包括`-a`?我很确定不需要它. (2认同)

Edd*_*die 13

rsync -aq --rsync-path='mkdir -p /tmp/imaginary/ && rsync' file user@remote:/tmp/imaginary/
Run Code Online (Sandbox Code Playgroud)

http://www.schwertly.com/2013/07/forcing-rsync-to-create-a-remote-path-using-rsync-path/,但不要从那里复制和粘贴,他的语法被屠杀.

它允许您执行任意命令来设置rsync可执行文件的路径.


mna*_*gel 7

我建议您手动强制存在:

ssh user@remote mkdir -p /top/a/b/c
rsync /top/a/b/c/d remote:/top/a/b/c
Run Code Online (Sandbox Code Playgroud)

如果目标文件夹尚不存在,它将创建目标文件夹。

  • 是的-这是一种方法。但是似乎我的用例非常有用,应该有一个命令或一些rsync选项。 (3认同)

Der*_*har 5

根据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
Run Code Online (Sandbox Code Playgroud)