- ベストアンサー
ファイル名を一括変更する方法とは?
- ファイル名を一括変更するための正規表現の方法を教えてください。
- リモート側のファイル名を一括変更するために、正規表現の方法がわかりません。
- 現在のコードではopendir関数を使用してディレクトリを開き、FTPlistに特定の正規表現パターンにマッチするファイルをフィルタリングしています。その後、foreachループを使用してファイル名を変更し、結果を出力しています。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#5のプログラムで $ftpになっている部分を $FTPに変更して下さい ($ftp->renameを$FTP->rename) 多分コレが#2のエラーの本質的原因です。
その他の回答 (6)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#5> 補足のプログラムでは、リモートのファイルのリストを取っていません。 opendir(DIR, $FTPdir); のファイル名は、ローカルですから リモートとファイル名が一致していないのではないでしょうか? リモートのファイルのリストは $FTP->ls でとってこないといけないと思います。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
リネームするのに使っている、スクリプトの全体を補足していただけませんか? (ユーザ名とかパスワードは変更して)
補足
sub main{ $FTP = Net::FTP -> new($FTPserver) or die('Net::FTP失敗。終了します。'); # FTP接続 if ($FTP) { $FTP -> login($FTPuser, $FTPpass) or die('login失敗。終了します。'); # ログイン print "にログインしました。\n"; $FTP -> cwd($FTPdir) or die('cwd失敗。終了します。'); # ディレクトリの変更 print "$FTPdirにディレクトリを変更しました。\n"; #システム日付の取得 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); #本番用 $year = 1900 + int($year); #本番用(年は1900マイナスで返ってくるため) $mon = 1 + $mon; #本番用(月は0~11で返ってくるため1プラスする) if ($mon < 10) { $mon = "0$mon"; } #一桁の月は頭に0をつける if ($mday < 10) { $mday = "0$mday"; } #一桁の日は頭に0をつける print "<システム日付:$year$mon$mday>\n"; #リストファイル画面出力 opendir(DIR, $FTPdir); @FTPlist = grep (/^$head$year$mon$mday.*\.csv$/, readdir(DIR)); closedir(DIR); if (@FTPlist){ foreach (@FTPlist) { $wk=$_; $wk =~ s/^$head$year$mon$mday(.*)\.csv$/$head$year$mon$xday$1\.csv/; $ftp -> rename($_,$wk); print ; print "\n"; } } $FTP -> quit or warn('初回quit失敗'); # FTP切断 print "\n"; print "FTPを切断しました。\n"; } close(MOUT); }
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>上記の記述はしているのですが・・・。 そうですか… こちらでも試しに $ftp->rename(from,to); してみましたが、問題なく動きました。 なので記述の問題ではないと思います。 Perlがインストールされているフォルダに lib/Net/FTP.pm というファイルがあると思うのですが、 その中に、 sub rename というメソッドを定義している部分があるはずなのですが、これがありますか? これがあるなら、 やはり、Ftpオブジェクトが正しく作られていないと思います。 今まで、ファイルの一覧とかゲットができているので、ちょっと考えにくいですが、何らかの原因で、接続できていないとかあるのかもしれません。
お礼
ご回答ありがとうございます。FTP.pmの中を確認しました。おっしゃるとおりsub renameという定義ありました。 接続も確認メッセージを出しながら実行しているので、できていると思うのですが。 renameの記述をコメントにすると正常に動作するようです。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>下記エラーがでてうまくいきませんでした。 あのぅ $ftp=Net::FTP->new("remoteHost"); から $ftp->login("name","password"); みたいな(今までにもやってきた)ことは、当然やった上でのエラーがでるという話ですよね? だとしたら変ですが、エラーメッセージからすると Net::FTP->newとかされていないというようなことだと思います。
お礼
回答ありがとうございます。もちろん上記の記述はしているのですが・・・。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
ごめんなさい、勘違いしていました。 use Net::FTP; を使って $ftp->rename(FROM, TO); つまり rename の部分を $ftp->rename($_, $wk); に変えて下さい。
お礼
ご回答ありがとうございます。 やってみたのですが、下記エラーがでてうまくいきませんでした。 Can't call method "rename" on an undefined value at ftprename.pl use Net ::FTPは定義したのですが。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
試してないけど、多分以下のような感じでいいと思う。 foreach (@FTPlist) { $wk=$_; $wk =~ s/^$head$year$mon$mday(.*)\.csv$/$head$year$mon$xday$1\.csv/; rename $_ , $wk; print ; print "\n"; }
お礼
ご回答ありがとうございます。 できるようなのですが、この指定だとリモートではなくローカルをみにいくようです。 この場合、リモート、ローカル、それぞれのパスを指定してrenameするのはどのようにするのでしょうか?
お礼
$FTPに修正したところ、renameできました。 ありがとうございます。