2012-01-28 5 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) 

ВЫВОД:

/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

ответ

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

+0

Можете ли вы поместить комментарии рядом с каждой из ваших переменных, чтобы показать их значение (т. Е. Что вы получаете от использования 'puts' или' p' на них)? Это облегчило бы отладку? Кроме того, я замечаю, что вы внесли несколько изменений в свой вопрос; вы показываете весь свой код сейчас? – SimonMayer

+0

Проблема заключается в следующем: 'audio_title = File.basename (' unzip -l # {pencast} | grep .aac | awk '{print $ 4;}' | awk 'NR ==' # {i} '' ') «Мне нужно преобразовать, как-то к другому типу? – beoliver