【问题标题】:renaming files using variables in Ruby在 Ruby 中使用变量重命名文件
【发布时间】:2012-01-28 10:14:06
【问题描述】:

如何在 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

【问题讨论】:

    标签: ruby variables renaming


    【解决方案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)
    

    【讨论】:

    • 我在脚本的开头指定了工作目录。所以红宝石知道它在哪里。但是,我尝试给出完整的路径名,但仍然相同。我再试一次……
    • 你能把 cmets 放在你的每个变量旁边以显示它们的值(即你从使用 putsp 得到什么)?它会使调试更容易吗?另外,我注意到您对您的问题进行了多次编辑;你现在显示所有代码了吗?
    • 问题似乎是:audio_title = File.basename(unzip -l #{pencast} | grep .aac | awk '{打印 $4;}' | awk 'NR=='#{i}'') 是否需要以某种方式转换为不同类型的刺痛?
    • 我试图让它更清楚。我不想把所有的东西都放进去,因为这会让事情变得有点复杂。我正在尝试删除需要和出错的部分,因此我可以将它们单独测试到脚本的其余部分。
    • audio_title 的值是多少?字符串是字符串,因此只要它具有正确的值(正确的文件名),这应该不是问题。我不得不承认我不明白你在用unzip -l #{pencast} | grep .aac | awk '{print $4;}' | awk 'NR=='#{i}'' 做什么,但是行尾附近的双' 看起来很不寻常。应该是这样的吗?
    猜你喜欢
    • 2016-04-18
    • 2018-11-10
    • 2019-07-05
    • 2015-02-08
    • 1970-01-01
    • 2018-09-01
    • 2016-01-14
    • 2011-07-28
    • 1970-01-01
    相关资源
    最近更新 更多