Search code examples
shellrsync

Cannot get rsync to accept `mkdir -p` (--parents) in rsync-path argument?


I've seen in posts like rsync - create all missing parent directories? :

rsync -aq --rsync-path='mkdir -p /tmp/imaginary/ && rsync' file user@remote:/tmp/imaginary/

I thought - great, let me try that:

$ rsync -aP --remove-source-files --rsync-path="mkdir -p /home/pi/ARCHIVE/2020/01/24 && rsync" a1.test a1.json a1.pdf /home/pi/ARCHIVE/2020/01/24/
sending incremental file list
rsync: mkdir "/home/pi/ARCHIVE/2020/01/24" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(675) [Receiver=3.1.2]

Well, sure mkdir "/home/pi/ARCHIVE/2020/01/24" failed - but I did NOT issue mkdir, i issued mkdir -p!

So why did rsync ignore this? Is there any other setting I should set for it? Or maybe rsync-path can be used STRICTLY for ssh connections (which is not the case here)?


Solution

  • --rsync-path only applies to remote machines:

    --rsync-path=PROGRAM    specify the rsync to run on remote machine
    

    This is because you don't need to invoke a second instance of rsync when you are doing a local copy. The copy will simply be done by the process you ran.

    Since it's technically you who are invoking rsync on the target machine, it's you who should be adding mkdir .. && in front of rsync:

    mkdir -p /home/pi/ARCHIVE/2020/01/24 &&
        rsync -aP --remove-source-files a1.test a1.json a1.pdf /home/pi/ARCHIVE/2020/01/24/