I want to automate rsyncing, and tried the following code:
TARGET="/media/USB\ DISK/Backup/"
rsync -av --delete ~/Data ${TARGET}
but the execution results in the following error:
rsync: link_stat "/media/USB\" failed: No such file or directory (2)
rsync: mkdir "/home/DISK/BACKUP" failed: No such file or directory (2)
because of the 'space' in the target filename. However, when I echo the command I can use that to run on the shell directly. 
How to do it correctly (which brackets, with backslash or without?) and why?
There are two possibilities:
TARGET="/media/USB DISK/Backup/"
rsync -av --delete ~/Data "${TARGET}"
or
TARGET=/media/USB\ DISK/Backup/
rsync -av --delete ~/Data "${TARGET}"
The first one preserves the space by quoting the whole string.  The second one preserves the space by escaping it with a backslash.  Also, the argument to the rsync command needs to be quoted.
When the string is both double-quoted and the space is preceded by a backslash, as in TARGET="a\ b", the result is that TARGET contains a literal backslash which is probably not what you wanted.  For more details, see the section entitled "Quoting" in man bash.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With