- ベストアンサー
perlでFTPサーバーのLOGを取得する方法
- perlを使用してFTPサーバーのLOGを取得する方法について説明します。保存先設定を1回だけ設定すれば、複数のファイルを指定先フォルダに保存することができます。また、1ヶ月分のLOGを取得する場合にはFor文を使用することをおすすめします。
- 保存先設定を1回だけ設定し、perlを使用してFTPサーバーのLOGを取得する方法について説明します。取得したファイルは指定先フォルダに保存されます。また、1ヶ月分のLOGを取得する場合にはFor文を使用することで、長文のプログラムを短くすることができます。
- perlでFTPサーバーのLOGを取得する方法を解説します。保存先設定を1回だけ行えば、複数のファイルを指定先フォルダに保存することができます。1ヶ月分のLOGを取得する場合にはFor文を利用することをおすすめします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じでしょうか。 動作確認はしていないのでバグがあるかもしれませんが…。 #!/usr/bin/perl use strict; use Net::FTP; chdir("保存先ディレクトリ") or die; my $ftp = Net::FTP->new("example.com") or die; $ftp->login("user", "pass") or die $ftp->message; $ftp->cwd("取得元ディレクトリ") or die $ftp->message; # すべてのログを取得 my @files = grep{ /^LOG_/ } $ftp->ls; # 12月分を取得 # my @files = grep{ /^LOG_12/ } $ftp->ls; # 最新の30日分を取得 # my @files = sort{ $b cmp $a }grep{ /^LOG_/ } $ftp->ls; # @files = splice(@files, 0, 30); # 11月20日から12月19日までを取得 # my @files = grep{ /^LOG_(\d+)/ && 1120 <= $1 && $1 <= 1219 } $ftp->ls; for(@files){ # 取得済みならスキップ next if -e $_; printf("get %s\n", $_); $ftp->get($_) or warn $ftp->message; }
その他の回答 (3)
- ryu_chan
- ベストアンサー率37% (69/186)
Date::Calcモジュールを使えばうるう年を気にせず書けると思いますが、多分、重いです。 日付関係では有用なモジュールなので今後の参考にされるといいと思います。 use Date::Calc qw(Delta_Days Add_Delta_Days); my $year = '2010'; my $startdate = '1120'; my $enddate = '1219'; my ($startmonth, $startday) = $startdate =~ /\d\d/g; my ($endmonth, $endday) = $enddate =~ /\d\d/g; my $delta_days = Delta_Days($year, $startmonth, $startday, $year, $endmonth, $endday); my @target_files; for my $day (0..$delta_days) { push @target_files, sprintf("LOG_%02d%02d.csv", (Add_Delta_Days $year, $startmonth, $startday, $day)[1,2]); }
お礼
Date::Calcモジュール 初めて聞きました。 勉強不足で恐縮です。 今後、多用しそうなので勉強させていただきます。 有難うございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
それは「必要な日付のリスト」を作ってしまうのが簡単じゃないかな. たとえば, まず my @daysofmonth = (0, 31, 29, 31, ..., 31); # 各月の日数 my @dates = (); for my $month (1 .. 12) { push @dates, map { sprintf "%02d%02d", $month, $_ } 1 .. $daysofmonth[$month]; } でリストを作っておく (必ず 2月29日が含まれることに注意: これが問題になるときは「うるう年かどうか」の判定も追加すること). んで, $startdate = '1120'; $enddate = '1219'; に対して grep { $startdate <= $_ && $_ <= $enddate } @dates で必要な日付のリストが取れるからあとはファイル名を組み立てて get. 「年をまたぐ」必要があるときには, そのまま扱うと面倒なのでまたがないように分けた方が楽だと思う.
お礼
なるほど、確かにリストを作ってしまった方がやりやすそうです。 うるう年のこと全く忘れていました。>< 難しそうですが、1つの方法としてやってみます。 有難うございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
ここに挙がっている例だと my @logfiles = qw(aaa bbb ccc); for my $logfile (@logfiles) { $ftp->get("取得元パス/$logfile.csv", "c:/log/$logfile.csv"); } でいいと思うんだけど.... その「LOGファイル」の名前の規則性, あるいはローカルなシステムにおける (「LOGファイル」を持ってきたファイルの) 名前の規則性がわかればもっと簡単かもしれん.
お礼
なるほど配列を使うやり方があるんですね。 For文も方うまくいきました。 有難うございます。 LOGファイルの出力は、LOG_月日.csvで出力されています。 例: LOG_0101.csv や LOG_1228.csv など 例えば、11月20日から12月19日までのLOGを取得したい場合も、 配列の部分をFor文にして行うことも可能なのでしょうか? (LOG_1120.csv から LOG_1219.csvまで) 何度も申し訳ありません ><
お礼
ご回答有難うございます。 様々な取得条件で書いてくださったこと感謝いたします。 実際動かしてみたら特にバグも発生せずできました。