rsync - create all missing parent directories?

前端 未结 7 1444
一个人的身影
一个人的身影 2020-12-29 01:32

I\'m looking for an rsync-like program which will create any missing parent directories on the remote side.

For example, if I have /top/a/b/c/d

相关标签:
7条回答
  • 2020-12-29 01:35

    i suggest that you enforce the existence manually:

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

    this creates the target folder if it does not exists already.

    0 讨论(0)
  • 2020-12-29 01:41

    --relative does not work for me since I had different setup. Maybe I just didn't understood how --relative works, but I found that the

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

    is easy to understand and does the job.

    0 讨论(0)
  • 2020-12-29 01:48

    I was looking for a better solution, but mine seems to be better suited when you have too many sub-directories to create them manually.

    Simply use cp as an intermediate step with the --parents option

    cp --parents /your/path/sub/dir/ /tmp/localcopy
    rsync [options] /tmp/localcopy/* remote:/destination/path/
    

    cp --parents will create the structure for you.

    You can call it from any subfolder if you want only one subset of the parent folders to be copied.

    0 讨论(0)
  • 2020-12-29 01:49
    rsync -aq --rsync-path='mkdir -p /tmp/imaginary/ && rsync' file user@remote:/tmp/imaginary/
    

    From http://www.schwertly.com/2013/07/forcing-rsync-to-create-a-remote-path-using-rsync-path/, but don't copy and paste from there, his syntax is butchered.

    it lets you execute arbitrary command to setup the path for rsync executables.

    0 讨论(0)
  • 2020-12-29 01:49

    According to https://unix.stackexchange.com/a/496181/5783, since rsync 2.6.7, --relative works if you use . to anchor the starting parent directory to create at the destination:

    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
    
    0 讨论(0)
  • 2020-12-29 01:54

    A shorter way in Linux to create rsync destination paths is to use the '$_' Special Variable. (I think, but cannot confirm, that it is also the same in OSX).

    '$_' holds the value of the last argument of the previous command executed. So the question could be answered with:

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

    0 讨论(0)
提交回复
热议问题