Ruby NET :: SCP包含通配符

时间:2013-06-05 21:32:18

标签: ruby scp net-ssh

我需要每天从我 SCP SSH 访问

的客户端下载文件。

文件名始终为/outgoing/Extract/visit_[date]-[timestamp].dat.gz'

例如,昨天的文件被称为visits_20130604-090003.dat.gz

我不能依赖时间戳总是相同的事实,但日期应始终是昨天的日期:

到目前为止我的设置:

我的主目录包含名为downloads_fullnamedownloads_wildcard的子目录。

它还包含一个名为foo.rb的简单ruby脚本。

foo.rb的内容是这个`

#! /usr/bin/ruby
require 'net/ssh'
require 'net/scp'
yesterday = (Time.now - 86400).strftime('%Y%m%d')

Net::SCP.start('hostname', 'username') do |scp|
  scp.download!('/outgoing/Extract/visits_' + yesterday + '-090003.dat.gz', 'downloads_fullname')
  scp.download!('/outgoing/Extract/visits_' + yesterday + '-*.dat.gz', 'downloads_wildcard')
end

运行时downloads_fullname目录包含该文件,但downloads_wildcard目录不包含该文件。

有没有办法在Net :: SCP中使用通配符?或者有人有任何狡猾的解决方法吗?我试过\*无济于事。

2 个答案:

答案 0 :(得分:4)

谢谢天男!

对于其他任何人来说,这是我最终跟随Tin Man领导的代码:

(试图将其发布为评论但有格式问题)

#! /usr/bin/ruby
require 'net/sftp'
yesterday = (Time.now - 86400).strftime('%Y%m%d')

Net::SFTP.start('hostname', 'username') do |sftp|
  sftp.dir.foreach("/outgoing/Extract") do |file|
     if file.name.include? '_' + yesterday + '-'
       sftp.download!('/outgoing/Extract/' + file.name, 'downloads/'+ file.name)
     end
  end
end

答案 1 :(得分:3)

我认为你不能使用scp到达那里,因为它希望你确切地知道你想要的文件,但是sftp会让你获得一个目录列表。

您可以使用Net::SFTP以编程方式选择文件并请求它。这是示例代码:

require 'net/sftp'

Net::SFTP.start('host', 'username', :password => 'password') do |sftp|
  # upload a file or directory to the remote host
  sftp.upload!("/path/to/local", "/path/to/remote")

  # download a file or directory from the remote host
  sftp.download!("/path/to/remote", "/path/to/local")

  # grab data off the remote host directly to a buffer
  data = sftp.download!("/path/to/remote")

  # open and write to a pseudo-IO for a remote file
  sftp.file.open("/path/to/remote", "w") do |f|
    f.puts "Hello, world!\n"
  end

  # open and read from a pseudo-IO for a remote file
  sftp.file.open("/path/to/remote", "r") do |f|
    puts f.gets
  end

  # create a directory
  sftp.mkdir! "/path/to/directory"

  # list the entries in a directory
  sftp.dir.foreach("/path/to/directory") do |entry|
    puts entry.longname
  end
end

基于此,您可以列出目录条目,然后使用findselect迭代返回的列表以查找具有当前日期的列表。将该文件名传递给sftp.download!以将其下载到本地文件。