我有一个如下所示的文件:
TTITLE0=track name 1
TTITLE1=track name 2和一个包含track01.cdda.wav.mp3和track02.cdda.wav.mp3的目录
我有下面的代码,它创建了两个不同的数组,一个包含曲目名称,另一个包含曲目标题:
tracks = Dir.glob("*.mp3")
tracknames = Array.new
File.open('read').each do |line|
if line =~ /TTITLE/
tracknames << line.split("=")[1].strip!
end
end这给了我两个数组:
["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)我必须记住,在未来,每个数组中可能有任意数量的元素,但这些元素的数量将彼此相等。
有什么想法吗?
发布于 2011-07-01 12:52:28
使用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发布于 2011-07-01 12:57:51
你真的需要两个数组吗?你只需要一个就行了:
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}"时,您将在该数组上调用to_s,而这只是将tracks中的所有单独字符串混在一起,作为一大堆“不是您想要的”。tracknames也是如此。而map不是您想要的,因为您没有对File.rename返回值做任何操作。但是,您可以这样做:
tracks.each {|track| File.rename("#{track}", "#{tracknames.shift}.mp3") }或者使用each_with_index
tracks.each_with_index {|track,i| File.rename("#{track}", "#{tracknames[i]}.mp3") }那一个会让tracknames完好无损。
https://stackoverflow.com/questions/6543689
复制相似问题