 
 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.
| Deleting Files that Match a Regular Expression (written by Matthew Palmer) | ||
|---|---|---|
| Code | Expected | Actual | 
| def delete_matching_regexp(dir, regex)
  Dir.entries(dir).each do |name| 
    path = File.join(dir, name)
    if name =~ regex
      ftype = File.directory?(path) ? Dir : File
      begin
        ftype.delete(path)
      rescue SystemCallError => e
        $stderr.puts e.message
      end
    end
  end
end
require 'fileutils'
tmp_dir = 'tmp_buncha_files'
files = ['A', 'A.txt', 'A.html', 'p.html', 'A.html.bak']
directories = ['text.dir', 'Directory.for.html']
Dir.mkdir(tmp_dir) unless File.directory? tmp_dir
files.each { |f| FileUtils.touch(File.join(tmp_dir,f)) }
directories.each { |d| Dir.mkdir(File.join(tmp_dir, d)) }
Dir.entries(tmp_dir) | [".", "..", "A", "A.txt", "A.html", "p.html", "A.html.bak", | [".", "..", "A", "A.txt", "A.html", "p.html", "A.html.bak", "text.dir", "Directory.for.html"] | 
| delete_matching_regexp(tmp_dir, /^[A-Z].*\.[^.]{4,}$/)
Dir.entries(tmp_dir) | [".", "..", "A", "A.txt", "p.html", "A.html.bak", "text.dir"] | [".", "..", "A", "A.txt", "p.html", "A.html.bak", "text.dir"] | 
| def move_matching_regexp(src, dest, regex)
  Dir.entries(dir).each do |name| 
    File.rename(File.join(src, name), File.join(dest, name)) if name =~ regex
  end
end
def append_matching_regexp(dir, suffix, regex)
  Dir.entries(dir).each do |name| 
    if name =~ regex
      File.rename(File.join(dir, name), File.join(dir, name+suffix)) 
    end
  end
end
def each_matching_regexp(dir, regex)
  Dir.entries(dir).each { |name| yield name if name =~ regex }
end
def append_matching_regexp(dir, suffix, regex)
  each_matching_regexp(dir, regex) do |name|
    File.rename(File.join(dir, name), File.join(dir, name+suffix))
  end
end
def delete_matching_regexp_recursively(dir, regex)
  Find.find(dir) do |path|
    dir, name = File.split(path)
    if name =~ regex
      ftype = File.directory?(path) ? Dir : File
      begin
        ftype.delete(path)
      rescue SystemCallError => e
        $stderr.puts e.message
      end
    end
  end
end | nil | |