I don’t know why sftp does this but you can only recursive copy if the destination directory already exists. So do this…
sftp> mkdir bin sftp> put -r bin
CORRECTED: I initially claimed wrongly that OpenSSH did not support
put -r. It does, but it does it in a very strange way. It seems to expect the destination directory to already exist, with the same name as the source directory.
sftp> put -r source Uploading source/ to /home/myself/source Couldn't canonicalize: No such file or directory etc. sftp> mkdir source sftp> put -r source Uploading source/ to /home/myself/source Entering source/ source/file1 source/file2
What’s especially strange is that this even applies if you give a different name for the destination:
sftp> put -r source dest Uploading source/ to /home/myself/dest Couldn't canonicalize: ... sftp> mkdir dest sftp> put -r source dest Uploading source/ to /home/myself/dest/source Couldn't canonicalize: ... sftp> mkdir dest/source sftp> put -r source dest Uploading source/ to /home/myself/dest/source Entering source/ source/file1 source/file2
For a better-implemented recursive
put, you could use the PuTTY
psftp command line tool instead. It’s in the
putty-tools package under Debian (and most likely Ubuntu).
Alternately, Filezilla will do what you want, if you want to use a GUI.
You might be interested in using
rsync instead. The command for that would be
rsync --delete --rsh=ssh -av bin/ remote-ip-or-fqdn:/home/earlz/blah/bin/
This will copy everything in
bin/ and place it in on the remote server in
/home/earlz/blah/bin/. As an added benefit, it will first check to see if the file on the remote side hasn’t changed, and if it hasn’t, it won’t re-send it. Additionally, you can add a -z option and it will compress it for you.