论坛首页 编程语言技术论坛

Rubycook 学习心得

浏览 2652 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (19) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-09-18  
学习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])
   发表时间:2008-09-18  
Dir["**/*rivers*"].each do |file_name|
  new_file_name = file_name.gsub(/rivers/, 'river')
  FileUtils.mv file_name, new_file_name
end

这么个小事还写这么一大堆代码…
0 请登录后投票
   发表时间:2008-09-19  
rename 's/rivers/river/' *


这么个小事还要写代码……
shell 命令
0 请登录后投票
   发表时间:2008-09-19  
总不能为每个重命令写一个Ruby代码吧,呵呵。
并且这个脚本是递归的,这个目录下的目录里面的文件也会被改名字。
0 请登录后投票
   发表时间:2008-09-19  
szpapas 写道
总不能为每个重命令写一个Ruby代码吧,呵呵。
并且这个脚本是递归的,这个目录下的目录里面的文件也会被改名字。


用shell的话,即使递归,也是一条命令搞定。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics