drefile: an automatic, chronological file organizer
---------------------------------------------------
Every few minutes drefile copies all files on your Desktop to a folder
such as ~/Documents/2009-06-June/26-Friday, prepending a timestamp
(like 20090626.1310) to the filename.
Use
---
1. Put files on your Desktop, and in a few minutes they will be 'drefiled'
2. Use the 'Today' alias on your Desktop to go to today's folder
3. Type 'dday' to go to today's directory
4. Type 'dmonth' to go to this month's directory
5. Type 'drefile file' to manually timestamp + move a file
Install
-------
1. sudo port install osxutils
2. sudo gem install open4
3. copy the 3 files below to ~/.bin (or whatever, in the path)
4. chmod +x the 3 files
5. crontab -e this: 0,5,10,15,20,25,30,35,40,45,50,55 * * * * /Users/luke/.bin/drefile >>
/Users/luke/.bin/drefile_cron.log
dday.rb
-------
#!/usr/bin/env ruby
require "fileutils"
month_and_day = Time.now.strftime("%Y-%m-%B/%d-%A")
dir = "/Users/luke/Documents/#{month_and_day}"
FileUtils.mkdir_p dir
puts "cd #{dir}"
dmonth.rb
---------
#!/usr/bin/env ruby
require "fileutils"
month = Time.now.strftime("%Y-%m-%B")
dir = "/Users/luke/Documents/#{month}"
FileUtils.mkdir_p dir
puts "cd #{dir}"
drefile
-------
#!/usr/bin/env ruby
# desktop refile
# requires mkalias from the osxutils port
# cron to run every 5 minutes
# 0,5,10,15,20,25,30,35,40,45,50,55 * * * * /Users/luke/.bin/drefile.rb >> /Users/luke/.bin/drefile_cron.log
HOME_DIRECTORY = "/Users/luke"
DESKTOP_DIRECTORY = "#{HOME_DIRECTORY}/Desktop"
STORAGE_DIRECTORY = "#{HOME_DIRECTORY}/Documents"
LOG_DIRECTORY = "#{HOME_DIRECTORY}/.bin"
SHELL = "/bin/bash"
require 'rubygems'
require 'open4'
require 'logger'
require "fileutils"
require 'time'
if ARGV.length == 0
# make the drefile dir
month_and_day = Time.now.strftime("%Y-%m-%B/%d-%A")
drefile_directory = "#{STORAGE_DIRECTORY}/#{month_and_day}"
FileUtils.mkdir_p(drefile_directory)
timestamp_prefix = Time.now.strftime("%Y%m%d.%H%M")
# remove the today alias
FileUtils.rm("#{DESKTOP_DIRECTORY}/Today") if File.exists?("#{DESKTOP_DIRECTORY}/Today")
# move files with a datetime prefix
Dir.entries(DESKTOP_DIRECTORY).reject{|f| f =~ /^\./}.each do |file_name|
FileUtils.mv("#{DESKTOP_DIRECTORY}/#{file_name}", "#{drefile_directory}/#{timestamp_prefix} #{file_name}")
end
# remake the today alias
`/opt/local/bin/mkalias -r "#{drefile_directory}" "#{HOME_DIRECTORY}/Desktop/Today"`
else
# make the drefile dir
timestamp = Time.parse(Open4.open4("mdls -name kMDItemFSCreationDate -raw #{ARGV.first}")[2].read)
drefile_directory = "#{STORAGE_DIRECTORY}/#{timestamp.strftime("%Y-%m-%B/%d-%A")}"
FileUtils.mkdir_p(drefile_directory)
new_file = "#{drefile_directory}/#{timestamp.strftime("%Y%m%d.%H%M")} #{ARGV.first}"
FileUtils.mv(ARGV.first, new_file)
puts new_file
end