我使用的是ruby Net-sftp创业板,在下载之前我需要下载大量的小文件,我需要确保获得给定目录中的文件列表。
为了做到这一点,我使用sftp.dir.entries('folder path').size来获取文件计数列表,但是对10,000个以上的文件执行这个操作需要花费太多的时间(甚至是小时),有更好的方法吗?
即使我尝试使用ssh.exec!("ls -l"),这也是缓慢的。
我正在尝试连接到windows box,它是windows server 2008 R2
发布于 2013-10-28 21:18:18
要下载一系列具有验证功能的文件,我将执行如下操作:
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,尽管我不能说明它将如何快速工作(Documents这里)。理论上,它可以加快查询速度(返回的数据较少),但由于它涉及更多的前期工作,我不确定它会有帮助。
我的脚本运行于一个VirtualBox,运行Ubuntu 12,专用内存为2GB(主机是Windows7),并连接到安装了Windows 2008 R2 SP1的服务器,运行SolarWind的SFTP部分;Ruby1.9.3p392,Net 2.1.2和Net-SH2.6.8。有了这些技术规范,我平均每分钟大约有78个文件(尽管没有验证)。
https://stackoverflow.com/questions/17683743
复制相似问题