• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ファイル名を一括変更したいが正規表現方法を教ええください。)

ファイル名を一括変更する方法とは?

このQ&Aのポイント
  • ファイル名を一括変更するための正規表現の方法を教えてください。
  • リモート側のファイル名を一括変更するために、正規表現の方法がわかりません。
  • 現在のコードではopendir関数を使用してディレクトリを開き、FTPlistに特定の正規表現パターンにマッチするファイルをフィルタリングしています。その後、foreachループを使用してファイル名を変更し、結果を出力しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.7

#5のプログラムで $ftpになっている部分を $FTPに変更して下さい ($ftp->renameを$FTP->rename) 多分コレが#2のエラーの本質的原因です。

whitelove
質問者

お礼

$FTPに修正したところ、renameできました。 ありがとうございます。

その他の回答 (6)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

#5> 補足のプログラムでは、リモートのファイルのリストを取っていません。 opendir(DIR, $FTPdir); のファイル名は、ローカルですから リモートとファイル名が一致していないのではないでしょうか? リモートのファイルのリストは $FTP->ls でとってこないといけないと思います。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

リネームするのに使っている、スクリプトの全体を補足していただけませんか? (ユーザ名とかパスワードは変更して)

whitelove
質問者

補足

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)
回答No.4

>上記の記述はしているのですが・・・。 そうですか… こちらでも試しに $ftp->rename(from,to); してみましたが、問題なく動きました。 なので記述の問題ではないと思います。 Perlがインストールされているフォルダに lib/Net/FTP.pm というファイルがあると思うのですが、 その中に、 sub rename というメソッドを定義している部分があるはずなのですが、これがありますか? これがあるなら、 やはり、Ftpオブジェクトが正しく作られていないと思います。 今まで、ファイルの一覧とかゲットができているので、ちょっと考えにくいですが、何らかの原因で、接続できていないとかあるのかもしれません。

whitelove
質問者

お礼

ご回答ありがとうございます。FTP.pmの中を確認しました。おっしゃるとおりsub renameという定義ありました。 接続も確認メッセージを出しながら実行しているので、できていると思うのですが。 renameの記述をコメントにすると正常に動作するようです。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>下記エラーがでてうまくいきませんでした。 あのぅ $ftp=Net::FTP->new("remoteHost"); から $ftp->login("name","password"); みたいな(今までにもやってきた)ことは、当然やった上でのエラーがでるという話ですよね? だとしたら変ですが、エラーメッセージからすると Net::FTP->newとかされていないというようなことだと思います。

whitelove
質問者

お礼

回答ありがとうございます。もちろん上記の記述はしているのですが・・・。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

ごめんなさい、勘違いしていました。 use Net::FTP; を使って $ftp->rename(FROM, TO); つまり rename の部分を $ftp->rename($_, $wk); に変えて下さい。

whitelove
質問者

お礼

ご回答ありがとうございます。 やってみたのですが、下記エラーがでてうまくいきませんでした。 Can't call method "rename" on an undefined value at ftprename.pl use Net ::FTPは定義したのですが。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

試してないけど、多分以下のような感じでいいと思う。 foreach (@FTPlist) { $wk=$_; $wk =~ s/^$head$year$mon$mday(.*)\.csv$/$head$year$mon$xday$1\.csv/; rename $_ , $wk; print ; print "\n"; }

whitelove
質問者

お礼

ご回答ありがとうございます。 できるようなのですが、この指定だとリモートではなくローカルをみにいくようです。 この場合、リモート、ローカル、それぞれのパスを指定してrenameするのはどのようにするのでしょうか?

関連するQ&A