2013-06-05 15 views
5

SCP sahip olduğum bir istemciden günlük bir dosya indirmem gerekiyor ama SSH erişim.Ruby NET :: SCP içeren Joker

dosya adı her zaman olacaktır /outgoing/Extract/visit_[date]-[timestamp].dat.gz' örnek dünkü dosyası visits_20130604-090003.dat.gz

Ben zaman damgası her zaman aynı olacağı gerçeği güvenemez çağırıldı, ancak tarih her zaman dünkü olmalıdır için

tarih:

Benim şimdiye kadar ayarlayın:

Evim dizini downloads_fullname ve downloads_wildcard adlı alt dizinlere içerir.

Ayrıca foo.rb adında basit bir ruby ​​komut dosyası içerir. downloads_fullname dizin dosyasını içeren çalıştırdığınızda foo.rb ait

içerikleri 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 

fakat downloads_wildcard dizin yok.

Net :: SCP'de joker kullanmanın bir yolu var mı? Yoksa herhangi bir kurnazlık çözümü var mı? \*'u boşa çıkarmaya çalıştım.

cevap

3

Orada hangi dosyayı istediğinizi bilmenizi beklediğinden scp'yi kullanarak ulaşabileceğinizi sanmıyorum, ancak bir dizin listesi almanıza izin verir.

Dosyanızı programa göre seçmek ve istemek için Net::SFTP kullanabilirsiniz. Buna dayanarak

 
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 

Eğer dizin girişleri sonra geçerli tarihle bulmak için döndürülen liste yineleme için find veya select kullanabilirsiniz listeleyebilirsiniz: Bu örnek kodudur. Yerel dosyaya indirmek için bu dosya adını sftp.download!'a iletin.

4

Teşekkür ederim Teneke Adam !!!

(yorum olarak göndermek için çalıştı ancak biçimlendirme vardı sorunları)

#! /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 
:

herkesten için

, burada Tin Man kurşun aşağıdaki ile sona erdi kodudur