Scheduled file sorting with Ruby I have a script running as an hourly cron job. It finds all screenshots on the Desktop and moves them to directories sorted by year/month/day.

On MacOS, screenshots are automatically saved to the desktop with the following filename structure:

"/Users/&lt;USER&gt;/Desktop/Screen Shot 2019-01-02 at 11.56.42 AM.png"

require 'fileutils'

class Screenshot
  attr_reader :filepath

  def initialize(filepath)
    @filepath = filepath
  end

  def dir_exists?
    File.exists?(destination) || FileUtils.mkdir_p(destination)
  end

  def date
    @date ||= filepath.match(screenshot_regex)
  end

  def move
    FileUtils.mv(filepath, destination) if dir_exists?
  end

  def base_path
    "/Users/home/Pictures/Screenshots"
  end

  def destination
    "#{base_path}/#{date[:year]}/#{date[:month]}/#{date[:day]}"
  end

  def screenshot_regex
    /Shot (?&lt;year&gt;(.*))-(?&lt;month&gt;(.*))-(?&lt;day&gt;(.*)) at/
  end
end

class Screenshots
  attr_reader :directory
  def initialize(directory)
    @directory = directory
  end

  def filepaths
    Dir.glob("#{directory}/Screen Shot*.png")
  end

  def files
    filepaths.map{|i| Screenshot.new(i)}
  end

  def move_all
    files.each(&amp;:move)
  end
end

Screenshots.new("/Users/home/Desktop").move_all


I'm sure there's a less messy approach here and I'd love to hear any criticism.
Your program is over-engineered in a way that makes it hard to decipher.  Because every method is one line long, it's like reading a poem whose lines have been scrambled.  You would be much better off writing a simple function, like this:

require 'fileutils'

def move_screenshots(src_dir, dest_tree)
  re = /^Screen Shot (?&lt;year&gt;\d{4})-(?&lt;month&gt;\d{2})-(?&lt;day&gt;\d{2}) at/
  Dir.foreach(src_dir) do |filename|
    if date = re.match(filename)
      dest_dir = "#{dest_tree}/#{date[:year]}/#{date[:month]}/#{date[:day]}"
      FileUtils.mkdir_p(dest_dir)
      FileUtils.mv("#{src_dir}/#{filename}", dest_dir)
    end
  end
end

move_screenshots("/Users/home/Desktop", "/Users/home/Pictures/Screenshots")


I wouldn't bother with Dir#glob, since it's a bit redundant with the regex.  Note that screenshots aren't necessarily in PNG format: the image format can be configured using defaults write com.apple.screencapture type ….  I also wouldn't bother testing File#exists? before calling FileUtils#mkdir_p, since mkdir_p implicitly performs that check anyway.

Instead of an hourly cron job, consider creating a Folder Action Script that is triggered instantly when a file is added to the folder.