2012-01-28 47 views
0

如何使用变量在Ruby中重命名文件?使用Ruby中的变量重命名文件

File.rename("text1.txt", "text2.txt") 

上面的例子使用IRB的时候,但我写一个脚本,其中两个VAR1和VAR2是未知对我来说是很好。

例如:

script_dir = File.expand_path File.dirname(__FILE__) 
Dir.chdir(script_dir) 

Dir.glob('Cancer1-1.pencast').each do |pencast| 
pencast_title = File.basename(File.basename(pencast), '.*') 
i = 1 
audio_title = File.basename(`unzip -l #{pencast} | grep .aac | awk '{print $4;}' | awk 'NR=='#{i}''`) 
audio_path = `unzip -l #{pencast} | grep .aac | awk '{print $4;}' | awk 'NR=='#{i}''` 
audio_extension = File.extname(File.basename(audio_path)) 
new_name = "#{pencast_title}-#{i}#{audio_extension}" 
File.rename(audio_title, new_name) 

不工作... 但如果我使用puts var1我看到我想要的文件名。

我得到的错误是:

prog_test.rb:12:in `rename': No such file or directory - audio-0.aac (Errno::ENOENT) 
or Cancer1-1-1.aac 
    from prog_test.rb:12 
    from prog_test.rb:5:in `each' 
    from prog_test.rb:5 

但文件audio-0.aac是存在的......我看着它。


我相信我已经找到了问题: 这似乎是增加一个变量给另一个变量。这是产生相同的输出一个简单的例子:

audio_title = "audio-0.aac" 
fullPath = File::SEPARATOR + "Users" + File::SEPARATOR + "name" + File::SEPARATOR + "Desktop" + File::SEPARATOR + audio_title 
newname = File::SEPARATOR + "Users" + File::SEPARATOR + "name" + File::SEPARATOR + "Desktop" + File::SEPARATOR + "audio1.aac" 

puts fullPath 
puts newname 

File.rename(fullPath, newname) 

OUTPUT:

/Users/name/Desktop/audio-0.aac 
/Users/name/Desktop/audio1.aac 
prog_test.rb:22:in `rename': No such file or directory - /Users/name/Desktop/audio-0.aac or /Users/name/Desktop/audio1.aac (Errno::ENOENT) 
    from prog_test.rb:22 
+0

为什么选择了倒票? – beoliver 2012-01-28 01:22:37

回答

1

你应该通过完整的文件路径File.rename,不只是基名

我不知道你在File.basename()的例子里发生了什么,但想象一下:

fullPath = "C:" + File::SEPARATOR + "Folder" + File::SEPARATOR + "File.txt" # C:\Folder\File.txt 
    basename = File.basename(fullPath) # File 
    newFileName = "File.bak" 

    File.rename(basename, newFileName) 
    # How can Ruby possibly know which directory to find the above file in, or where to put it? - It will just look in the current working directory 

因此,您需要将完整路径传递给File.rename,如下所示:

fullPath = "C:" + File::SEPARATOR + "Folder" + File::SEPARATOR + "File.txt" # C:\Folder\File.txt 
    directory = File.dirname(fullPath) # C:\Folder 
    newFileName = "File.bak" 

    File.rename(fullPath, directory + File::SEPARATOR + newFileName) 
+0

我在脚本的开头指定了工作目录。所以红宝石知道它在哪里。然而,我试图给出完整的路径名,但仍然是一样的。我会再试一次... – beoliver 2012-01-28 01:40:30

+0

你可以在你的每个变量旁边放置注释以显示它们的值(也就是你使用'puts'或'p'得到的值)吗?这将使调试更容易?另外,我注意到你已经对你的问题进行了多次编辑。你现在正在显示你的所有代码吗? – SimonMayer 2012-01-28 01:52:07

+0

这个问题似乎是:'audio_title = File.basename('unzip -l#{pencast} | grep .aac | awk'{print $ 4;}'| awk'NR =='#{i}''') “我需要转换为不同类型的刺痛吗? – beoliver 2012-01-28 01:57:11