Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby net sftp:获取文件列表的最快方法_Ruby_Net Ssh_Net Sftp - Fatal编程技术网

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

ruby net sftp:获取文件列表的最快方法,ruby,net-ssh,net-sftp,Ruby,Net Ssh,Net Sftp,我使用的是ruby Net sftp gem,在下载之前我需要下载大量的小文件,我需要确保获得给定目录中的文件列表。 为了做到这一点,我正在使用sftp.dir.entries('folder path').size获取文件计数列表,但对10000多个文件执行此操作花费了太多的时间(甚至数小时),有没有更好的方法 甚至我也尝试使用ssh.exec!(“ls-l”)这也很慢。 我正在尝试连接到windows box,即windows server 2008 R2。要下载一系列带有验证的文件,我将执

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

我正在尝试连接到windows box,即windows server 2008 R2。要下载一系列带有验证的文件,我将执行以下操作:

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服务器协议存在差异,这会影响
远程_文件
可访问的属性数量;打开连接后,您可以通过调用
sftp.protocol
来检查正在使用的协议

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


我从一个运行Ubuntu12的VirtualBox上运行我的脚本,专用内存为2GB(主机是Windows7),并连接到一个安装了WindowsServer2008R2 SP1的服务器,在SFTP部分运行SolarWind;Ruby 1.9.3p392、Net SFTP 2.1.2和Net SSH 2.6.8。有了这些技术规格,我平均每分钟大约有78个文件(虽然没有验证)。

要下载一系列有验证的文件,我会做如下操作:

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服务器协议存在差异,这会影响
远程_文件
可访问的属性数量;打开连接后,您可以通过调用
sftp.protocol
来检查正在使用的协议

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

我从一个运行Ubuntu12的VirtualBox上运行我的脚本,专用内存为2GB(主机是Windows7),并连接到一个安装了WindowsServer2008R2 SP1的服务器,在SFTP部分运行SolarWind;Ruby 1.9.3p392、Net SFTP 2.1.2和Net SSH 2.6.8。使用这些技术规格,我平均每分钟大约有78个文件(虽然没有验证)。

“我需要确保我在给定目录中获得一个文件列表”-你能解释一下为什么需要它吗?
我需要在下载前运行一些验证
“我需要确保我在给定目录中获得一个文件列表”-你能解释一下为什么需要这个吗?
我需要在下载之前运行一些验证