• 締切済み

配列を使ってファイル名のリネーム

Perl超初心者ですが、 あるディレクトリ内の500ファイルを配列処理で リネームできないか検討しています; @oldname=(4001,4005,4125・・・4050) を @newname=(8038,8952,8273,・・・7000) にリネーム。 難しそうなので、フリーソフトも探したのですが、 見つからず、困ってます。 よろしくお願いします。

  • Perl
  • 回答数3
  • ありがとう数4

みんなの回答

  • _mer_
  • ベストアンサー率47% (27/57)
回答No.3

良い回答が出ているようですので、書いても、と思ったんですが、一応考え方、という事で書いておきます。 固定的なのと流動的(汎用的)なのについてなんですが、 例えば「あるディレクトリ内にあるファイルを全て、ある規則に従って名前を変更する」と言うのが、 頻繁に発生する場合は、流動的(汎用的)なプログラムを書く必要があるかなと思ったのです。 そういうファイル名をプログラム内部(外部にせよ)に持つよりかは、 ls(リストコマンド)の何かしらのオプションでファイル名だけを取り込むようにして、 それを規則にそって変更する方が何にでも使えるからです。 (あとで色々応用が出来ます) ただある程度、そのように規則的に決まっているもの、とか、ほとんど使わない、という場合は、 データを先に作ってそれに従って、と言う固定的なプログラムの方が、 作るにも修正にも楽で良いかなと思って、どちらの場合なのかなと思ったのでした。 ともあれHead_Syndicateさんの方法+若干のエラー処理を加えるだけで問題ないと思います。 上手くいくと良いですね。

回答No.2

仮にそのような配列が与えられているとしたら、 for (my $i = 0; $i < @oldname; $i++) { rename($oldname[$i], $newname[$i]); } でいいと思います。基本はこれですが、例えば途中で すでに使われている名前を作ろうとしたときはエラーにするとか、 いくつかリネームした途中で失敗したらどうする、とか、そういった ことを考えておいたほうがいいかもしれませんね。 あとは@oldname, @newnameの作り方でしょうか。なにかファイルに 4001,8038 4005,8952 ....... とペアを書いておいて、例えばrename_dat.200105とかいう名前で 保存しておき、 % perl myrename.pl rename_dat.200105 の形式で実行できるようにしておくとか。こうすればrename_dat.*を 年4回書きなおして実行すればよくなります。 なるべく、ちょっとの変更で仕事が済むようにするのがコツですよ。 また、「あのファイルを変更すればいい」と後から思い出しやすく しておくのもコツ。私など1ヶ月以上前のことはすぐ忘れますから。

  • _mer_
  • ベストアンサー率47% (27/57)
回答No.1

少し確認なのですが、このファイル名の変更は今回のみですか?それとも何度もやるようなものですか? (流動的か固定的か) もしも何度もやるようであれば、perlなりshなりで、きちんとスクリプトを組むのが良いとは思うんですけれども、 もしも、もう現状あるファイルを単に変えたいというのであれば、 まぁ同じですがshとかでバッチファイルみたいなものを固定で作成して、 コマンド行をずらずら並べて実行みたいにした方が早いと思うんですけども。 いかがでしょうか??

ikurakun
質問者

補足

_mer_さん、早速のレスありがとうございます。 >少し確認なのですが、このファイル名の変更は今回のみで>すか?それとも何度もやるようなものですか? >流動的か固定的か) 正直に言うと、年4回程度です。 どちらかというと、固定的なのでしょうか?

関連するQ&A

  • ファイル名のリネームについて

    フリーソフトのFlexible Renamerを使ってmp3のファイル名をリネームしたいと考えています。 ◆元のファイル名 「アーティスト名」「 全角-」「 タイトル」.mp3 (例)安室奈美恵-Hero.mp3   ↓ ◆リネーム後 「トラック番号」「半角スペース」「タイトル」.mp3 (例)7 Hero.mp3 という形にリネームしたいのです。 リネーム後の「トラック番号」はmp3のIDタグから取得し、「タイトル」はIDタグではなく、元のファイル名のままにしたいと考えています。 添付画像の状態まではできるのですが、それ以降がわかりません。どのようにすればよいでしょうか?

  • 画像をプレビューしながらファイル名をリネーム

    スキャニングした画像に記載されている番号をファイル名に変えたいのですが、枚数が多いためXPのエクスプローラーからのリネームは時間がかかるので、もっと効率の上がるリネーム方法を探しています。 フリーソフトの「Namery」を試しましたが、画像のプレビュー画面が小さいので断念しました。 大きな画面で見れるものがあれば良いのですが…。 画像をプレビューしながらファイル名をリネームできるようなフリーソフトをご存知でしたら教えてください。

  • 古いファイルを含むディレクトリのリネーム

    古いファイルを含むディレクトリのリネーム Linuxサーバのファイル整理の目的で 指定ディレクトリ以下の階層の複数フォルダについて 古い画像ファイル(90日以上変更がない".jpg"ファイル)しかないものは (1)ディレクトリ名をリネーム(ディレクレトリ名末尾に"_deleted"を追加) (2)ディレクトリ内の古いファイルを削除 したいと考えております。 find と xargs をつなげてあげれば、(2)単体であればできるのですが ex.) find . -type f -ctime +90 -print0 | xargs -0 rm 「格納されている全てのファイルが対象となる場合」に「ディレクトリ名をリネームして」 という処理で悩んでおります。 皆様、アドバイスの程お願い致します。 ========================================== 環境: ========================================== OS: CentOS5.4 bashなどを利用して,簡易的に実行できればと考えております。

  • ファイル名を日付の名前にリネームするバッチファイルの作り方

    Windowsを使い、Webアプリのログファイルをテキストで保存させてますが、今のところひとつのファイルにログが貯まる形式になってますので、これをWindowsのタスクを使ってバッチファイルを作って毎日テキストのログファイルを日付の名前にリネームしようと検討しております。 日付の名前にファイルをリネームする方法をお教え下さい。もしくは同等の機能を有したフリーソフトもお願い致します。

  • 画像ファイルをリネームをしつつ、ディレクトリ分けをしたい

    ファイルを連番にしないと作業ができないソフトを使用して画像処理を行うことになりました。 そのため、ソースのデータファイルのディレクトリ構造操作と、 リネームを行いたいのですが、何か簡便な方法をご存知の方がいらっしゃいましたらご助言お願いしたいと思います。 【作業工程】 <ソース>※####部分は、0001~0050の連番ファイルです。 /test/a/test_a.####.jpg(50file) /test/b/test_b.####.jpg(50file) /test/c/test_c.####.jpg(50file) /test/d/test_d.####.jpg(50file) 上記200fileを、 /test/test/test_####.jpg と、連番にします。 ※####部分は、0001~0200の連番ファイルです。 画像処理ソフトにて、作業終了後、 元のディレクトリ構造とファイル名に戻したいのですが…。 現在は手動でディレクトリ分けをしてからフリーソフトでリネームしております。 画像処理ソフトの仕様はどうしても変更がきかないので困っております。 「Flexible Renamer」で、そのような処理を行える、という意見もお聞きしたのですが、方法がわかりません。 精通された方がいらっしゃいましたら、ご助言よろしくお願い致します。

  • apple scriptファイル名の一部のみ変更

    apple scriptにおいて、ファイル名変更の自動化を試みています。 ファイル名にabcという文字が含まれる場合、それらをdefに 変更する、というようなことがしたいのですが、 (001abc.txt -> 001def.txt 003abc0.txt -> 003def0.txt) apple scriptにおいて set oldName to name of aObj --- newNameを指定 set name of aObj to newName の上記でoldNameからnewNameをどう得たらよろしいでしょうか?

    • ベストアンサー
    • Mac
  • ファイル名のリネームとコピーを問合せ形式で行いたい

    よろしくお願いします。 ファイル名のリネームとコピーをDOSコマンドで問合せ形式で行うBATを作りたいのですが、作り方を教えて頂きたく質問をさせて頂きます。 実行環境は「Windows Server 2008 R2」です。 やりたいことは、 (1)BATをDOSプロンプトで起動 (2)「リネームするファイルのディレクトリを選択してください」と聞いてきて、番号が付いたディレクトリの一覧(固定で3個)が画面に表示されて、番号で指定。 (3)「リネーム前のファイル名を選択してください」と聞いてきて、番号が付いたファイルの一覧(固定で10個)が画面に表示されて、番号で指定。 (4)「リネーム後のファイル名を入力してください」と聞いてきて、ファイル名を入力。 (5)「xxxをyyyにリネームします。よろしいですか?」と聞いてきて、「はい」ならリネームを実行、「いいえ」なら(2)に戻る。エラーならBAT終了。 (6)「リネームを繰り返しますか?」と聞いてきて、「はい」なら(2)~(5)を繰り返し、「いいえ」なら(7)へ。 (7)「コピー元のディレクトリを選択してください」と聞いてきて、番号が付いたディレクトリの一覧(固定で4個)が画面に表示されて、番号で指定。 (8)「コピー元のファイル名を選択してください」と聞いてきて、番号が付いたファイルの一覧(固定で10個)が画面に表示されて、番号で指定。 (9)「コピー先のディレクトリを入力してください」と聞いてきて、番号が付いたディレクトリの一覧(固定で4個)が画面に表示されて、番号で指定。 (10)「xxxをyyyにコピーしますよろしいですか?」と聞いてきて、「はい」ならコピーを実行、「いいえ」なら(7)に戻る。エラーならBAT終了。 (11)「コピーを繰り返しますか?」と聞いてきて、「はい」なら(7)~(10)を繰り返し、「いいえ」ならBAT終了。 初心者レベルではこのようなBATが作成できずに困っております。 どうぞ、よろしくお願いします。

  • デスクトップの隠しファイルの名前をリネームしてしまいました

    WindowsXPです。 リネーム君というソフトを使い、デスクトップ上のファイルを複数選択して一括リネームしようと試みました。 しかし、リネームしたいものだけ複数選択をしてもディレクトリ単位で作業するらしく、隠しファイルまでリネームしてしまいました。 何かシステム上重要なファイルで、リネームにより参照できなくなりはしないか心配です。(現状ではまだ何も起きておりませんが) .iniと.dbと.docの形式のファイルが1つずつあります。 このうち、.docファイルだけは隠しファイルの表示でデスクトップに表示することができました。 もし、わかるようなら元ファイル名を教えていただけませんでしょうか? よろしくお願いします。

  • ファイルをリネームしたんですが・・・

    ファイルをリネームしたんですが、いいフリーソフトはないでしょうか? ファイル名が ***(smxxx).mp4(もしくはflv) となっているのを、 [smxxx]***.mp4(もしくはflv) という風に書き直したいんです。 ***は任意の文字列、xxxは数字です。 いい方法が無いならFlexible Renamerでなんとかやっていこうとおもうので、Flexible Renamerでいい方法があるならそちらも教えて欲しいです。

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

    こんにちは。Perl(超?)初心者です。 フォルダ内にあるファイルの名前を、「filename_ja.txt」という形式から「filename_en.txt」に変更するスクリプトを書こうとしているのですが、エラーになってうまくいきません。 環境は、Windows XP professional SP3とActivePerl 5.10 で、以下のように記述しました。 use strict; use warnings; my @filename = glob "*.txt"; foreach my $oldname(@filename) { my $newname = $oldname; $newname = ~s/(.+)_ja\.txt/$1_en\.txt/; rename ($oldname,$newname); } これを実行すると、「Use of uninitialized value $_ in substitution (s///) at test_5.pl line 8.」とエラーメッセージが出て、フォルダ内のテキストファイルが消失してしまいます。 また、以下のようにも書いてみたのですが、やはりうまくいきません。 この場合は、エラーこそ出ないものの、なにも起こりません。 use strict; use warnings; for(<\.txt>) { my $old=$_; s/(.+)_ja\.txt/$1_en\.txt/; rename($old,$_); } 初歩的な質問で申し訳ありませんが、ダメな生徒にアドヴァイスを与えるつもりで、スクリプトを添削していただけるとありがたいです。 よろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう