33

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 fibon82@machineB.com
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/ fibon82@machineB.com:/home/b/
fibon82
  • 333
  • 1
  • 3
  • 5
  • 3
    `put -r` would have worked too. – jhenninger Feb 08 '12 at 16:07
  • 1
    Ok but how could I know that for "put command" the option -r is available? If I look [here](http://www.computerhope.com/unix/sftp.htm) only the flag -P is described... The same in the [manual](http://www.r3v0.net/docs/Delta/man/sftp.html) Thanks! :) – fibon82 Feb 09 '12 at 00:37
  • You should post that as an answer instead. – N.N. Mar 07 '12 at 20:20
  • Yes. Instead of EDITing your question with the answer, you should answer your own question and accept it. –  Jun 05 '14 at 08:32
  • @fibon82 For up-to-date manual to OpenSSH `sftp`, refer to the [OpenSSH project](http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/sftp.1). – Martin Prikryl Dec 22 '14 at 19:56

6 Answers6

31

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

 put -r .

See man sftp.

Carlos Da Costa
  • 411
  • 4
  • 3
  • 1
    The `-r` switch is supported since [OpenSSH 5.4](http://www.openssh.com/txt/release-5.4) only. – Martin Prikryl Dec 22 '14 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 May 03 '16 at 11:57
  • 1
    This should be the answer! It simply works for uploading an entire directory tree. – Shahar Nov 25 '22 at 07:31
24

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/ user@remote.host.com:/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.

Karolos
  • 2,584
  • 14
  • 14
  • Ah thank you! :) A new thing that I learned! – fibon82 Feb 09 '12 at 00:08
  • @fibon82: You're welcome :) – Karolos Feb 09 '12 at 06: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 :) ) – Sandro Antonucci Dec 18 '12 at 22:18
  • 3
    Sadly `rsync` does not speak `sftp`-Protocol. So if you set up an [`sftp`-chroot using `ssh`'s build in `internal-sftp`](https://wiki.archlinux.org/index.php/SFTP_chroot) then `rsync` fails. – Tino May 03 '16 at 11:54
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/ user@remote.host.com:/home/b/
deed02392
  • 2,982
  • 6
  • 26
  • 36
4

Try using

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

for more info check out: this

guest_who
  • 41
  • 1
  • 2
    The `-r` switch is supported since [OpenSSH 5.4](http://www.openssh.com/txt/release-5.4) only. – Martin Prikryl Dec 22 '14 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 May 03 '16 at 12:00
  • As far as I can tell, it copies `a/` inside `b/`, but only if `b/a/` already exists. – Eric Duminil Dec 10 '19 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
Dieter
  • 1
  • Have you added reference and proof supporting what you state and confirmed this answer is not already answered in one of the existing answers on the post. Read over ["Why do I need 50 reputation to comment"](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i-do-instead) to ensure you understand how you can start commenting. – Vomit IT - Chunky Mess Style Oct 05 '17 at 14:13
-1

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

mput -rp /home/a/ /home/b/
jayarjo
  • 129
  • 6