34

On machine A I have the folder

/home/a/

On machine B I have the folder

/home/b/

I wish transfer all files, directories and sub-directories of /home/a in /home/b with sftp On machine A I tried the commands:

sftp [email protected]
put /home/a/* /home/b/

but it doesn't work, i get the error message: "skipping non-regular file /home/a/a1"... [a1 is a sub-directory of a]
How could I modify the put instruction?

Thanks! :)

EDIT:

I solved using scp:

scp -r /home/a/ [email protected]:/home/b/
5
  • 3
    put -r would have worked too.
    – jhenninger
    Commented Feb 8, 2012 at 16:07
  • 1
    Ok but how could I know that for "put command" the option -r is available? If I look here only the flag -P is described... The same in the manual Thanks! :)
    – fibon82
    Commented Feb 9, 2012 at 0:37
  • You should post that as an answer instead.
    – N.N.
    Commented Mar 7, 2012 at 20:20
  • Yes. Instead of EDITing your question with the answer, you should answer your own question and accept it.
    – user41608
    Commented Jun 5, 2014 at 8:32
  • @fibon82 For up-to-date manual to OpenSSH sftp, refer to the OpenSSH project. Commented Dec 22, 2014 at 19:56

6 Answers 6

25

Although not strictly equivalent to sftp, rsync is a very powerful alternative for scp and sftp, especially when updating the copies from machine A to machine B, as it doesn't copy the files that haven't been altered; it's also able to remove files from machine B that have been deleted from machine A (only when it's told to of course).

In your case, the syntax would be

rsync -zrp /home/a/ [email protected]:/home/b/

The -r option is for recursively copying files, -z enables compression during the transfer, and -p preserves the file permissions (file creation, edit, etc.) when copying, which is something that scp doesn't do AFAIK. Many more options are possible; as usual, read the man pages.

4
  • Ah thank you! :) A new thing that I learned!
    – fibon82
    Commented Feb 9, 2012 at 0:08
  • @fibon82: You're welcome :)
    – Karolos
    Commented Feb 9, 2012 at 6:47
  • 1
    i love you, i synced 400MB of data in 1 minute by just using your code. I would add you should also use --progress otherwise you'll be staring at nothing without knowing what's happening (and at what speed :) ) Commented Dec 18, 2012 at 22:18
  • 4
    Sadly rsync does not speak sftp-Protocol. So if you set up an sftp-chroot using ssh's build in internal-sftp then rsync fails.
    – Tino
    Commented May 3, 2016 at 11:54
33

In sftp this command recursively uploads content of the current directory to the remote current directory:

 put -r .

See man sftp.

3
  • 1
    The -r switch is supported since OpenSSH 5.4 only. Commented Dec 22, 2014 at 19:52
  • 1
    Note that the -r switch is client side only (part of sftp command). So the server (here: receiving) side does not need OpenSSH 5.4, only the client needs to support it.
    – Tino
    Commented May 3, 2016 at 11:57
  • 1
    This should be the answer! It simply works for uploading an entire directory tree.
    – Shahar
    Commented Nov 25, 2022 at 7:31
10

scp (secure copy) is the Linux de facto for transferring files over a secure tunnel. In your case you would want to use the recursive switch, e.g.:

scp -r /home/a/ [email protected]:/home/b/
2
  • 6
    sftp and scp are actually different protocols, both based on ssh.
    – paradroid
    Commented Feb 8, 2012 at 16:20
  • 1
    Yes, if the server only allows sftp protocol, this answer does not work.
    – рüффп
    Commented Dec 6, 2013 at 14:05
4

Try using

put -r /home/a/ /home/b/

for more info check out: this

3
  • 2
    The -r switch is supported since OpenSSH 5.4 only. Commented Dec 22, 2014 at 19:52
  • 1
    Note that the -r switch is client side only (part of sftp command). So the server (here: receiving) side does not need OpenSSH 5.4, only the client needs to support it. And: This should be the accepted answer, as getting (the possibly unsupported) rsync as answer to a question tagged sftp is a bit confusing.
    – Tino
    Commented May 3, 2016 at 12:00
  • As far as I can tell, it copies a/ inside b/, but only if b/a/ already exists. Commented Dec 10, 2019 at 14:16
0

Actually, put -r should work. But the destintion folder needs to be present on your remote host:

sftp> put -r sourcefolder
 Uploading sourcefolder/ to /user/folder
 Couldn't canonicalize: No such file or directory
 ....
sftp> mkdir sourcefolder
sftp> put -r sourcefolder
 Uploading sourcefolder/ to /user/folder/sourcefolder
 Entering sourcefolder/
 sourcefolder/file1
 sourcefolder/file2
1
-1

In my case rsync wasn't possible so I used:

mput -rp /home/a/ /home/b/
1
  • There's no mput command in OpenSSH sftp. Maybe you refer to psftp? Commented Dec 22, 2014 at 19:52

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .