переименование файлов с использованием переменных в Ruby - PullRequest
0 голосов
/ 28 января 2012

Как вы используете переменные для переименования файлов в 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

1 Ответ

1 голос
/ 28 января 2012

Вы должны передать полный путь к файлу 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)
...