2

我正在使用 ruby​​ Net-sftp gem,我需要在下载之前下载大量小文件,我需要确保获取给定目录中的文件列表。
为了做到这一点,我sftp.dir.entries('folder path').size用来获取文件计数列表,但是对超过 10,000 个文件执行此操作需要花费太多时间(甚至数小时)有没有更好的方法来做到这一点?
即使我尝试使用ssh.exec!("ls -l")它也很慢。
我正在尝试连接到 windows server 2008 R2 的 windows box

4

1 回答 1

4

要下载一系列带有验证的文件,我会执行以下操作:

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_filesftp.protocol您可以在打开连接后通过调用来检查您正在使用的协议。

或者,如果您想尝试将验证作为查询的一部分传递给 SFTP,您可以尝试.glob("/path/to/folder", "*.ext")而不是.entries您的验证是否基于文件扩展名,尽管我无法说明它将如何在速度方面工作(文档在这里)。从理论上讲,它可以加快查询速度(返回更少的数据),但由于它涉及更多的前期工作,我不确定它是否会有所帮助。

我正在从运行 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 个文件(尽管这没有经过验证)。

于 2013-10-28T21:18:18.040 回答