【问题标题】:How do I rename the extension of an individual file through Ruby?如何通过 Ruby 重命名单个文件的扩展名?
【发布时间】:2013-08-08 10:03:39
【问题描述】:

我正在尝试找出一种重命名单个文件扩展名的有效方法。我在网上查看了一堆方法,但它们似乎都是用于批量转换文件,使用基本的.each do 块。在这些块中,我注意到 FileUtils 被大量使用,但我认为这是因为给出了一个目录路径,它的使用迫在眉睫。我知道如何使用批量方法,我只是不确定单个方法,例如: def convert_file_extension(input_file) ... 结束

非常感谢任何帮助!

【问题讨论】:

  • 我怀疑是否有比 grepping 文件并分别重命名它们更好的方法。
  • 可能,但是批量转换的缺点是你不能选择特定的文件来更改。

标签: ruby file


【解决方案1】:

这个语句可以解决问题:

def self.rename_file(input_file, output_file)
  File.rename(input_file, output_file) if !File.exist?(output_file)
end

感谢@7stud 和@ostapische!

【讨论】:

    【解决方案2】:
    def change_ext(fname, new_ext)
      i = fname.rindex(".") 
      i ? (fname[0...i] + new_ext) : (fname + new_ext)
    end
    
    puts change_ext("/usr/local/file", ".xyz")
    puts change_ext("/usr/local/file.txt", ".xyz")
    
    
    --output:--
    /usr/local/file.xyz
    /usr/local/file.xyz
    

    【讨论】:

    • 太棒了!输入文件的内容是否有可能被覆盖?文件是否会自动保存以便更改保持不变?
    • 在 ruby​​ 程序中更改字符串对您计算机上的任何文件都没有任何影响——仅更改名为 your_name 的变量会更改您在县登记处的出生证明。但是,File 类有一个名为 rename 的方法,它将更改您计算机上的文件名。
    • 文件的内容不可能被覆盖,因为您没有写入文件。 File.rename("oldname", "newname")
    • 但是有一个潜在的问题:如果您有两个名为 /dir1/dir2/abc/dir1/dir2/abc.txt 的文件,并且您将它们都重命名为 .xyz 扩展名,那么您最终会得到两个文件名为:/dir1/dir2/abc.xyz ,如果您随后重命名每个文件,则第二次重命名将覆盖第一个文件。但是您始终可以先使用 if 语句来检查 File.exists?(new_fname)
    • File.rename 行改为File.save(input_file) 怎么样?
    【解决方案3】:

    添加到上面给出的解决方案:

    您可以将文件路径分解为各个组件:File.dirname 产生目录部分,File.extname 返回扩展名。 File.basename 只为您提供文件名,可以选择删除扩展名。这样,您也可以轻松地构造新的文件名(当然也可以使用 File.rename 来实际更改文件名)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 2014-05-29
      相关资源
      最近更新 更多