2012-01-28 45 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