使用ruby更改文件扩展名

时间:2013-02-21 11:04:42

标签: ruby-on-rails ruby rubygems

我有一个远程文件夹中的.eml文件列表

\\abcremote\pickup

我想重命名

中的所有文件
xyz.eml to xyz.html

你们可以帮我用红宝石做这件事。

提前致谢。

6 个答案:

答案 0 :(得分:24)

稍微改善以前的答案:

require 'fileutils'
Dir.glob('/path_to_file_directory/*.eml').each do |f|
    FileUtils.mv f, "#{File.dirname(f)}/#{File.basename(f,'.*')}.html"
end

File.basename(f,'.*')将为您提供没有扩展名的名称,否则文件将最终为file_name.eml.html而不是file_name.html

答案 1 :(得分:7)

Rake提供了一个简单的命令来更改扩展名:

require 'rake'
p 'xyz.eml'.ext('html') # -> xyz.html

再次改善以前的答案:

require 'rake'
require 'fileutil'
Dir.glob('/path_to_file_directory/*.eml').each do |filename|
    FileUtils.mv( filename, filename.ext("html"))
end

答案 2 :(得分:4)

Pathname使用sub_ext()方法替换扩展名,以及glob()rename(),允许接受的答案更紧凑地重写:

require 'pathname'
Pathname.glob('/path_to_file_directory/*.eml').each do |p|
    p.rename p.sub_ext(".html")
end

答案 3 :(得分:3)

简单

'abc . . def.mp3'.sub /\.[^\.]+$/, '.opus'

答案 4 :(得分:2)

只要您有权访问该文件夹位置,就可以使用Dir.globFileUtils.mv

Pathname.glob('path/to/directory/*.eml').each do |f|
  FileUtils.mv f, "#{f.dirname}/#{f.basename}.html"
end

答案 5 :(得分:0)

一种方法是使用net-sftp库: 下面的方法将重命名所有具有所需文件扩展名的文件,这也将确保其他格式不受影响。

  1. dir =" path / to / remote / directory"
  2. actual_ext =" .eml"
  3. desired_ext =" .html"
  4. 
    
    require 'net/sftp'
      def add_file_extension(dir, actual_ext, desired_ext)
        Net::SFTP.start(@host, @username, @password) do |sftp|
          sftp.dir.foreach(dir) do |file|
            if file.name.include? actual_ext
              sftp.rename("#{dir}/#{file.name}", "#{dir}/#{file.name.slice! actual_ext}#{desired_ext}")
            else
              raise "I cannot rename files other than which are in #{actual_ext} format"
            end
          end
        end
      end