在Ruby中使用变量重命名文件

在Ruby中使用变量重命名文件,ruby,variables,renaming,Ruby,Variables,Renaming,在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.b

在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)
不起作用。。。 但是如果我使用
put 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

您应该将完整的文件路径传递给
文件。重命名
,而不仅仅是basename

我不确定您的示例在
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)

我在脚本的开头指定了工作目录。所以ruby知道它在哪里。但是,我尝试过给出完整的路径名,但仍然是相同的。我会再试一次……您能在每个变量旁边添加注释以显示它们的值吗(即,使用
put
p
得到的值)?这会使调试变得更容易吗?此外,我注意到您对问题进行了多次编辑;你现在正在显示你所有的代码吗?问题似乎是:
audio\u title=File.basename(
unzip-l{pencast}grep.aac | awk'{print$4;}'awk'NR='{i}'
我需要将它转换成另一种类型的sting吗?我正在努力让它更清楚。我不想把一切都放在一边,因为这会让事情变得有点复杂。我正试图删掉需要的部分和出错的部分,这样我就可以对脚本的其余部分分别进行测试。
audio\u title
的值是多少?一个字符串就是一个字符串,所以只要它有正确的值(正确的文件名),就不会有问题。我必须承认,我不明白你在用
unzip-l#{pencast}grep.aac|awk'{print$4;}'| awk'NR=='{I}'
做什么,但行末的双
'
看起来不寻常。应该是这样吗?