This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
Renaming Files in Bulk | ||
---|---|---|
Code | Expected | Actual |
require 'find' module Find def rename(*paths) unrenamable = [] find(*paths) do |file| next unless File.file? file # Skip directories, etc. 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 module_function(:rename) end require 'fileutils' tmp_dir = 'tmp_files' Dir.mkdir(tmp_dir) ['CamelCase.rb', 'OLDFILE.TXT', 'OldFile.txt'].each do |f| FileUtils.touch(File.join(tmp_dir, f)) end tmp_dir = File.join(tmp_dir, 'subdir') Dir.mkdir(tmp_dir) ['i_am_SHOUTING', 'I_AM_SHOUTING'].each do |f| FileUtils.touch(File.join(tmp_dir, f)) end $DEBUG = true Find.rename('./') { |file| file.downcase } |
Renaming ./tmp_files/subdir/I_AM_SHOUTING to ./tmp_files/subdir/i_am_shouting Renaming ./tmp_files/OldFile.txt to ./tmp_files/oldfile.txt Renaming ./tmp_files/CamelCase.rb to ./tmp_files/camelcase.rb |
Renaming ./tmp_files/subdir/I_AM_SHOUTING to ./tmp_files/subdir/i_am_shouting Renaming ./tmp_files/OldFile.txt to ./tmp_files/oldfile.txt Renaming ./tmp_files/CamelCase.rb to ./tmp_files/camelcase.rb |
Find.rename('./') { |file| file + '.txt' unless file.index('.') } |
Renaming ./tmp_files/subdir/i_am_shouting to ./tmp_files/subdir/i_am_shouting.txt Renaming ./tmp_files/subdir/i_am_SHOUTING to ./tmp_files/subdir/i_am_SHOUTING.txt |
Renaming ./tmp_files/subdir/i_am_shouting to ./tmp_files/subdir/i_am_shouting.txt Renaming ./tmp_files/subdir/i_am_SHOUTING to ./tmp_files/subdir/i_am_SHOUTING.txt |
module Find 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 module_function(:change_extensions) end tmp_dir = 'tmp_graphics' Dir.mkdir(tmp_dir) ['my.house.jpeg', 'Construction.Gif', 'DSC1001.JPG', '52.PNG'].each do |f| FileUtils.touch(File.join(tmp_dir, f)) end Find.change_extensions({/jpe?g/i => 'jpg', /png/i => 'png', /gif/i => 'gif'}, tmp_dir) |
Renaming tmp_graphics/52.PNG to tmp_graphics/52.png Renaming tmp_graphics/DSC1001.JPG to tmp_graphics/DSC1001.jpg Renaming tmp_graphics/Construction.Gif to tmp_graphics/Construction.gif Renaming tmp_graphics/my.house.jpeg to tmp_graphics/my.house.jpg |
Renaming tmp_graphics/52.PNG to tmp_graphics/52.png Renaming tmp_graphics/DSC1001.JPG to tmp_graphics/DSC1001.jpg Renaming tmp_graphics/Construction.Gif to tmp_graphics/Construction.gif Renaming tmp_graphics/my.house.jpeg to tmp_graphics/my.house.jpg |