Project

cleaner

0.0
No commit activity in last 3 years
No release in over 3 years
Cleaner is a small tool which helps you keep your directories clean. With simple DSL you define set of rules, which are then periodically executed against specified directory.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

Runtime

 Project Readme

Cleaner Build Status


Tool for automatic management of directories on your disk with simple DSL. Inspired by Hazel app.

Installation

$ gem install cleaner

Example configuration file

manage '~/Downloads' do
  # Move avi's and audio files to right places
  move :avi, :to => '~/Movies/inbox'
  move %w(mp3 ogg), :to => '~/Music/inbox'

  # label all files bigger than 100MB with red color (OS X only)
  label :color => :red, :bigger_than => 100.megabytes

  # Remove zip files if file without zip extension exists (uncompressed files)
  delete :zip, :if => proc { |file| File.exists?(file.path_without_ext) }

  # Move all VAT invoices to a special place
  move :pdf, :if => proc { |file| file.name =~ /VAT/ }, :to => '~/Documents/invoices'

  # You've probably installed it already
  delete :dmg, :after => 10.hours

  # Delete everything older than 1 month.
  # Was here for so long? Doesn't deserve to exist!
  delete :after => 1.month
end

Usage

Generate sample configuration file (~/.cleaner.rb)

$ cleaner init

Run cleaner in the background. By default it will run every 1 hour.

$ cleaner start

You can specify cleaning interval with "rails like" syntax: 20.minutes, 4.hours, 1.day

$ cleaner start 4.hours

Stop cleaner daemon

$ cleaner stop

Available actions

  • Deleting files

    delete :zip
  • Moving files

    move :pdf, :to => '~/Documents/pdfs'
  • Copying files

    copy :mp3, :to => '~/Documents/audio'
  • Labeling files with colors (OS X only). Available colors: :white, :orange, :red, :yellow, :blue, :purple, :green, :gray

    label :txt, :color => :blue

Available conditions

Conditions are used for more accurate files matching.

  • :after - Matches files created given period time ago

    :after => 2.days
  • :if - Matches file for which block returns true. File object is passed to the block.

    :if => proc { |file| file.name =~ /foo/ }
  • :smaller_than - Matches files which are smaller than the given value

    :smaller_than => 10.megabytes
  • :bigger_than - Matches files which are bigger than the given value

    :bigger_than => 1.megabyte

Third party actions

  • Subtitles - Fetching polish subtitles for movies

Writing own actions

New actions can be added easily. All you need to do is implement #execute method.

Useful methods when implementing own actions:

  • #files - array of filtered file paths
  • #options - hash of options passed to action
# Here as example is label action which sets color label on files on OS X
module Cleaner
  module Actions
    class Label < Action
      COLORS = {
        :white  => 0,
        :orange => 1,
        :red    => 2,
        :yellow => 3,
        :blue   => 4,
        :purple => 5,
        :green  => 6,
        :gray   => 7,
      }
      def execute
        code = COLORS[options[:color]]
        files.each do |path|
          script = %Q{tell application \\"Finder\\" to set label index of file (POSIX file \\"#{path}\\") to #{code}}
          `osascript -e "#{script}"`
        end
      end
    end
  end
end

Using custom action

Require action in your config file and use it as any other action.

require 'label.rb'
manage '/add-more-colors-to-your-files' do
  # all avi files are labeled with green color
  label :avi, :color => :green
  # all files bigger than 100 megabytes are labeled with red color
  label :color => :red, :if => proc { |file| file.size > 100.megabytes }
end

Contributions

To fetch & test the library for development, do:

$ git clone https://github.com/wijet/cleaner
$ cd cleaner
$ bundle
$ bundle exec rspec

If you want to contribute, please:

  • Fork the project.
  • Make your feature addition or bug fix.
  • Add tests for it. This is important so I don't break it in a future version unintentionally.
  • Send me a pull request on Github.