Net::SFTP, copying directory recursively

M

Manish Sapariya

Hi,
I am trying to copy a remote directroy recursively using Net::sftp.

I could not find any direct api given by this module and decided to
copy the entire directory file by file.

However i am not able to figure out, how to tell between file or directory.

I am trying to follow simple method,

for every file in directory
if file is direcory
create directory
else
get/put directory
end

However I am not able to find out any method to figure out the type of
file on remote machine.

Any ideas?
Thanks and Regards,
Manish
 
A

Andy Koch

Manish said:
Hi,
I am trying to copy a remote directroy recursively using Net::sftp.

I could not find any direct api given by this module and decided to
copy the entire directory file by file.

However i am not able to figure out, how to tell between file or directory.

I am trying to follow simple method,

for every file in directory
if file is direcory
create directory
else
get/put directory
end

However I am not able to find out any method to figure out the type of
file on remote machine.

Any ideas?
Thanks and Regards,
Manish


I just had this same problem, while I didn't solve your precise issue;
the following code will recursively download the contents of a folder.

It's rather crude, if anyone has a refactor suggestion I'm quite open to
hear it.


#################################################
require 'rubygems'
require 'net/sftp'

def open_or_get_all(sftp, open_dir, local_dir)
handle = sftp.opendir(open_dir)
items = sftp.readdir(handle)
items.each do |item|
if item.filename != '.' && item.filename != '..'
if item.longname[0...1] == 'd'
# mkdir locally
Dir.mkdir(local_dir + item.filename, 0777)
# open dir and download all
open_or_get_all(sftp, open_dir + item.filename + '/', local_dir
+ item.filename + '/')
else
#puts local_dir+item.filename
#puts open_dir+item.filename
sftp.get_file open_dir+item.filename, local_dir+item.filename
end
end
end
sftp.close_handle(handle)
end

Net::SFTP.start('ext_server', 'user_name', 'password') do |sftp|
open_or_get_all(sftp, "/home/user_name/dir_to_dnld/", "/lcl_dir/")
end


#################################################

maybe that will save someone else a few minutes...
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,772
Messages
2,569,593
Members
45,111
Latest member
VetaMcRae
Top