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 |