Uploading directories with sftp?
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.