2013-06-05 59 views
5

我需要每天從客戶端下載文件,我有SCP但不是SSH訪問。Ruby NET ::包含通配符的SCP

文件名總是會/outgoing/Extract/visit_[date]-[timestamp].dat.gz'

例如昨天的文件名爲visits_20130604-090003.dat.gz

我不能依賴於一個事實,即時間戳將永遠是相同的,但日期應該永遠是昨天日期:

我成立至今:

我的home目錄包含名爲downloads_fullnamedownloads_wildcard子目錄。

它還包含一個名爲foo.rb的簡單ruby腳本。

foo.rb的內容this`

#! /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中使用通配符?還是有人有任何狡猾的解決方法?我試過\*無濟於事。

回答

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!以將其下載到本地文件。

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