我正在使用ruby Net-sftp gem,我需要在下载之前下载大量小文件我需要确保获取给定目录中的文件列表。
为了做到这一点,我使用sftp.dir.entries('folder path').size
来获取文件计数列表,但是对超过10,000个文件执行此操作需要花费太多时间(甚至几小时)是否有更好的方法来执行此操作?
即使我尝试使用ssh.exec!("ls -l")
,这也很慢
我想连接到Windows服务器2008 R2的Windows框
答案 0 :(得分:3)
下载一系列带验证的文件,我会做类似以下的事情:
Net::SFTP.start(ftp_host, user, :password => password) do |sftp|
sftp.dir.entries('/path/to/folder').each do |remote_file|
if passes_validation?(remote_file)
file_data = sftp.download!('/path/to/folder' + '/' + remote_file.name)
local_file = File.open('/path/to/local', 'wb')
local_file.print file_data
local_file.close
end
end
end
使用此方法时要记住的一件事是SFTP服务器协议存在差异,这会影响remote_file
可访问的属性数量;您可以在打开连接后致电sftp.protocol
来查看您正在使用的协议。
或者,如果您想尝试将验证作为查询的一部分传递给SFTP,如果您的验证基于文件扩展名,则可以尝试.glob("/path/to/folder", "*.ext")
而不是.entries
,尽管我可以谈论它如何以速度方式工作(文件here)。从理论上讲,它可以加速查询(返回的数据更少),但由于它涉及更多的工作,我不确定它会有所帮助。
我从运行Ubuntu 12的VirtualBox运行我的脚本,其中2 GB RAM专用(主机是Windows 7),并连接到安装了Windows Server 2008 R2 SP1的服务器,为SFTP部分运行SolarWind; Ruby 1.9.3p392,Net-SFTP 2.1.2和Net-SSH 2.6.8。根据这些技术规格,我平均每分钟平均78个文件(虽然没有验证)。