• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ファイル名変更ができません)

ファイル名変更ができません

このQ&Aのポイント
  • Perl初心者の質問です。フォルダ内のファイル名を変更するスクリプトを実行したいが、エラーが発生して上手くいきません。
  • 使用している環境はWindows XP professional SP3とActivePerl 5.10です。
  • 既存のファイル名を「filename_ja.txt」から「filename_en.txt」に変更したいが、エラーメッセージが表示されファイルが消失してしまいます。

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

  • ベストアンサー
  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.1

$1_en\.txt を、 ${1}_en\.txt に代えたらどうでしょう? 一般的に、 "" や m// の様な変数と文字列を混在して書ける所では、変数名の終りを意識せずに書くと後続の文字列も含めて変数名と解釈される場合があります。 そのときは、上記の様に変数名を {} で囲みましょう。 ところで... > $newname = ~s/(.+)_ja\.txt/$1_en\.txt/; = と ~ の間に空白は、本当は無いんですよね? 「=~」はひとつの演算子で、途中の空白は無い方が良いです。 「=~」の前後には、空白がある方が良いです。 ところで その2 $newname =~ s/_ja\.txt$/_en\.txt/; の方が良いと思いますよ。

Kazu_creator
質問者

お礼

早速のご回答ありがとうございました。 ご指摘のとおり、= と ~ の間にスペースがあり、ついでに =~ の後ろにスペースがありませんでした。ここを直したら、意図したとおりに動きました。 ところで、ファイル名を変更したいファイルは「en」というファルダに入っているのですが、このフォルダ名を引っ張ってきて、「_ja.txt」を「_en.txt」にすることは初心者にも可能でしょうか。 というのも、C:\foldername\en、C:\foldername\de、C:\foldername\frという3つのフォルダに大量のファイルが格納されていて、それぞれ「en」フォルダのファイルは「_en.text」に、「de」は「_de.txt」に、「fr」は「_fr.txt」にファイル名を変更する必要があるのです。 これを処理するスクリプトは、初心者にはハードルが高すぎるでしょうか。 想像するに、C:\foldername 以下のディレクトリ名を取得して、そこから最後の2文字を切り出して、それを配列やら変数やらに代入してなどなど、難しそうな作業が満載のような気がします。

その他の回答 (2)

  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.3

条件の後出しは(スクリプト書く上で)非常に嫌われるので、最初に出来る限り出しておいたほうがいいですよ。 use strict; use warnings; use File::Copy; my $dir = "C:/foldername"; my @langs = qw/en de fr/; foreach my $lang (@langs) { while (my $file = glob "$dir/$lang/*.txt") { my $rename = $file; $rename =~ s/_jp\.txt$/_$lang.txt/; move ($file, $rename); } }

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.2

> 初心者にも可能でしょうか。 やりたい事がもっと詳細かつ具体的に分らないと何とも言えませんね。 Perl初心者というよりプログラミング初心者ならなおさらです。 ・C:\foldername は例なんでしょうが、1個だけか沢山あるのか? ・対象ファイルは、C:\foldername/*/ 直下のみかサブディレクトリ下にもあるのか? まずは、 glob に絶対パスを渡して簡単になりませんか? glob "C:/foldername/en/*_ja.txt" とか glob "C:/foldername/*/*_ja.txt"

Kazu_creator
質問者

お礼

ご助言ありがとうございます。 glob に絶対パスを渡すこともできるのですね。 それなら、 my @filename = glob "C:/foldername/en/*_ja.txt" <ファイル名変更の処理> my @filename = glob "C:/foldername/de/*_ja.txt" <ファイル名変更の処理> my @filename = glob "C:/foldername/fr/*_ja.txt" <ファイル名変更の処理> のように、重ねていけばいけそうな気がします。 土臭いやり方ですけど。

関連するQ&A