学习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
保存代码为 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])