2013-06-05 31 views
5

SCPを持っていて、のSSHにアクセスしているクライアントから毎日ファイルをダウンロードする必要があります。Ruby NET :: SCPワイルドカードを含む

ファイル名は、常に私はタイムスタンプは常に同じになりますが、日付は常に昨日べきであるという事実に頼ることができない例の昨日のファイルの場合/outgoing/Extract/visit_[date]-[timestamp].dat.gz'

visits_20130604-090003.dat.gz

と呼ばれていただろう日付:

私は、これまでの設定:

をマイホームディレクトリがdownloads_fullnamedownloads_wildcardという名前のサブディレクトリに含まれています。

また、foo.rbという単純なルビスクリプトも含まれています。

downloads_fullnameディレクトリを実行すると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_wildcardディレクトリにはありません。

Net :: SCPでワイルドカードを使用する方法はありますか?それとも誰かが邪悪な回避策を持っていますか?私は\*を無駄にしようとしました。

答えて

3

あなたはあなたが望むファイルを正確に知っていると思うので、scpを使ってそこに行くことはできませんが、sftpはディレクトリリストを取得させます。

Net::SFTPを使用して、プログラムでファイルを選択して要求することができます。これはサンプルコードです:

あなたは現在の日付を持つものを見つけるために、返されたリストを反復するために findselectを使用して、ディレクトリエントリを一覧表示することができていることに基づいて
 
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 

。そのファイル名を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 
関連する問題