2011-07-01 15 views
1

の要素を持つ配列の要素の名前を変更します異なるアレイ、トラックのタイトルとトラック名と1と1:ルビーは、私は、このようなファイルを持っている別のアレイ

tracks = Dir.glob("*.mp3") 

tracknames = Array.new 
File.open('read').each do |line| 
    if line =~ /TTITLE/ 
    tracknames << line.split("=")[1].strip! 
    end 
end 

これは私の2つの配列を与えます

["track name 1", "track name 2"] 

["track01.cdda.wav.mp3", "track02.cdda.wav.mp3"] 

私は、最初の配列の要素を持つ二番目の配列内のファイルの名前を変更したいと思います。したがって、"track01.cdda.wav.mp3""track name 1.mp3"になります。ここ

は私がこれまでにしようとしているものです:

tracks.map {|track| File.rename("#{tracks}", "#{tracknames}.mp3") } 

をし、私はエラーを取得:

No such file or directory - track01.cdda.wav.mp3track02.cdda.wav.mp3 or track name 1track name 2 (Errno::ENOENT) 

私は将来的に任意の数の要素があるかもしれないことを心に留めておく必要があり各配列内の数字は等しくなります。

+0

なぜ誰かがこれを落とした理由を説明したいですか? – rick

答えて

4

使用Array#zip:また

tracks.zip(tracknames).each do |track, trackname| 
    File.rename track, "#{trackname}.mp3" 
end 

(以下楽しいが、前の列挙への配列の中間の配列を作成しません):

tracks.each_with_index do |track, i| 
    File.rename track, "#{tracknames[i]}.mp3" 
end 
+0

素晴らしい、私のために働いた1つ目は問題なし。トラック番号の先頭に数字を追加する場合はどうすればよいですか? 2番目の例とFile.renameトラック "#[i]#{tracknames [i]} .mp3"を使用できますか? – rick

+1

そうですね、このような2番目のテクニックを使うことができます。そうでなければ、次のようにすることができます: 'tracks.zip(tracknames).each_with_index {|(track、trackname)、i | ...} ' – Phrogz

+0

完璧です。ちょうど私が探していたもの。ありがとう! – rick

2

は、あなたが実際には2つの配列を持っている必要がありますか?あなただけのものにすることによって得ることができる:

tracks = Dir.glob("*.mp3") 
File.open('read').each do |line| 
    if line =~ /TTITLE/ 
    to = line.split("=")[1].strip! 
    File.rename tracks.shift, "#{to}.mp3" 
    end 
end 

そしてそれの終わりに、あなたのshift呼び出しが空のtracksを残していますが、それは問題ではないかもしれません。あなたのよう

限り:

tracks.map {|track| File.rename("#{tracks}", "#{tracknames}.mp3") } 

アプローチが行く、問題はあなたが"#{tracks}"としてそれを補間し、それは同じように一緒にtracks内のすべての個々の文字列をマッシュときtracksアレイ上to_sを呼んでいるということです"あなたが望むものではない"という1つの大きな山です。 tracknamesについても同様です。 mapは、返り値File.renameで何もしていないので、あなたが望むものではありません。 1はそのままtracknamesを残すだろうと

tracks.each_with_index {|track,i| File.rename("#{track}", "#{tracknames[i]}.mp3") } 

tracks.each {|track| File.rename("#{track}", "#{tracknames.shift}.mp3") } 

またはeach_with_indexを使用します。ただし、これを行うことができます。

+0

私はそれについて考えていましたが、それを働かせることはできませんでした。これは、名前を変更する適格な行が見つかるとすぐに名前の変更を処理します。クール。 – rick

+1

@rick:それは、「偽の怠惰」とは違って、良いことである「真の怠惰」と呼ばれています。そうでない場合を除いて。 –

関連する問題