ruby net sftp:获取文件列表的最快方法

Loh*_* MV 2 ruby net-ssh net-sftp

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

Ian*_*anL 5

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

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
Run Code Online (Sandbox Code Playgroud)

使用此方法时要记住的一件事是,SFTP 服务器协议存在差异,这会影响可访问的属性数量remote_filesftp.protocol您可以在打开连接后通过调用来检查正在使用的协议。

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

我正在从运行 Ubuntu 12 且具有 2 GB 专用 RAM(主机是 Windows 7)的 VirtualBox 运行我的脚本,并连接到安装了 Windows Server 2008 R2 SP1 的服务器,为 SFTP 部分运行 SolarWind;Ruby 1.9.3p392、Net-SFTP 2.1.2 和 Net-SSH 2.6.8。根据这些技术规格,我大约平均每分钟处理 78 个文件(尽管这是未经验证的)。