Rubycook 学习心得

学习Ruby CookBook,看到里面的字符串替换的功能不错,于是就简单的改造了一下,用来对文件名进行批量修改了。

保存代码为 rn.rb 放在Windows 目录下面。

rn "string1" "string" "filename"

比如:

F:\Mapdata\gzgis\Test>rn rivers river  ..\
Renaming ..\Test/rivers.prj to ..\Test/river.prj
Renaming ..\Test/rivers.dbf to ..\Test/river.dbf
Renaming ..\Test/rivers.shx to ..\Test/river.shx
Renaming ..\Test/rivers.shp to ..\Test/river.shp
Renaming ..\Test/rivers_region.shx to ..\Test/river_region.shx
Renaming ..\Test/rivers_region.shp to ..\Test/river_region.shp
Renaming ..\Test/rivers_region.prj to ..\Test/river_region.prj



require 'find'
module Find
  def rename(*paths)
    unrenamable = []
    find(*paths) do |file|
      next unless File.file? file 
      path, name = File.split(file)
      new_name = yield name

      if new_name and new_name != name
        new_path = File.join(path, new_name)
        if File.exists? new_path
          unrenamable << file
        else
          puts "Renaming #{file} to #{new_path}" if $DEBUG
          File.rename(file, new_path)
        end
      end
    end
    return unrenamable
  end
  def change_extensions(extension_mappings, *paths)
    rename(*paths) do |file|
      base, extension = file.split(/(.*)\./)[1..2]
      new_extension = extension
      extension_mappings.each do |re, ext|
        if re.match(extension)
          new_extension = ext
          break
        end
      end
      "#{base}.#{new_extension}"
    end
  end
  
  def change_names(name_mappings, *paths)
    rename(*paths) do |file|
      name, extension = file.split(/(.*)\./)[1..2]
      new_name = name
      name_mappings.each do |re, name|
				new_name.gsub!(re,name)
      end
      "#{new_name}.#{extension}"
    end
  end
  module_function(:change_names)
  module_function(:change_extensions)
  module_function(:rename)
end


$DEBUG = true

Find.change_names({"#{ARGV[0]}" => "#{ARGV[1]}" }, ARGV[2])

你可能感兴趣的:(windows,ext,脚本,F#,Ruby)