OK, just finished porting my toolbox to OS X. I’ve gotten rid of all those dumb text files and generators, as they were really only needed under Windows.
I ported some stuff to take advantage of my Ruby utilities library, and threw out a lot of cruft. Here’s what made the cut…
am
#!/bin/sh twtr up -m "$1"
append
#!/usr/bin/ruby require 'utility' puts Util.new.get_piped_data.append(ARGV.join(' '))
clipboard
#!/usr/bin/ruby require 'utility' input = Util.new.get_piped_data if input IO.popen('pbcopy', 'w').print(input) else puts `pbpaste` end
date
#!/usr/bin/ruby require 'utility/enhancements' puts Time.new.format_date
date_time
#!/usr/bin/ruby require 'utility/enhancements' puts Time.new.format
define
#!/bin/bash open http://dictionary.reference.com/search?q=$(echo $@ | sed 's/ /+/g')
delete
#!/usr/bin/ruby require 'utility' util = Util.new storage = util.load(:storage) storage.delete(ARGV.join(' ')) util.save(:storage, storage)
email
#!/usr/bin/ruby require 'utility' util = Util.new util.parse_rfc822(util.get_piped_data).send
event
#!/usr/bin/ruby require 'utility' file = File.open(File.join(ENV['HOME'], "events.txt"), "a") file.puts "#{Time.new.format}t#{ARGV.join(' ')}"
find_movie
#!/bin/bash open "http://www.netflix.com/Search?v1=$(echo $@ | sed 's/ /+/g')"
find_show
#!/bin/bash open "http://www3.tivo.com/tivo-tco/search.do?searchFor=$(echo $@ | sed 's/ /+/g')&dispatch=simplesearch&searchCategory=&x=0&y=0"
get
#!/bin/bash scp -r $@ ~/Downloads
group_rename
#!/usr/bin/ruby require 'utility' require 'fileutils' #Get options. usage = "Usage: group_rename.rb expression filesn" expression = ARGV.empty? ? raise(usage) : ARGV.shift globs = ARGV.empty? ? raise(usage) : ARGV #For each file in expanded globs: globs.each do |glob| Dir.glob(glob).each do |path| #Evaluate the expression. new_path = eval "path.#{expression}" #If the resulting filename is identical to the current filename, skip it. next if path == new_path #If filenames differ only in case, move it to temp file first. if path.downcase == new_path.downcase FileUtils.mv(path, path + ".tmp") FileUtils.mv(path + ".tmp", new_path) #Otherwise, simply move file. else FileUtils.mv(path, new_path) end end end
indent_xml
#!/usr/bin/ruby require 'utility' puts Util.new.get_piped_data.indent_xml
interpolate
#!/usr/bin/ruby require 'utility/all' print Util.new.get_piped_data.interpolate
list
#!/usr/bin/ruby require 'utility' util = Util.new print util.load(:storage).keys.sort.join("n")
load
#!/usr/bin/ruby require 'utility' util = Util.new print util.load(:storage)[ARGV.join(' ')]
locate
#!/bin/bash open "http://local.google.com/local?q=$(echo $@ | sed 's/ /+/g')&near=[my+address]"
lower_case
#!/usr/bin/ruby STDIN.each{|l| puts l.downcase}
newsgroup
#!/bin/bash open "http://groups.google.com/group/$(echo $@ | sed 's/ /+/g')"
nohup.out
note
#!/usr/bin/ruby require 'utility' util = Util.new Utility::Email::Email.new( :senders => [util.load(:home_email)], :recipients => [util.load(:home_email)], :subject => "Note: #{ARGV.join(' ')}", :body => util.get_piped_data ).send
one_line
#!/usr/bin/ruby require 'utility' puts Util.new.get_piped_data.one_line
prepend
#!/usr/bin/ruby require 'utility' puts Util.new.get_piped_data.prepend(ARGV.join(' '))
quote
#!/bin/bash wrap 60 | prepend "> "
reminder
#!/usr/bin/ruby require 'utility' util = Util.new Utility::Email::Email.new( :senders => [util.load(:home_email)], :recipients => [util.load(:home_email)], :subject => "Reminder: #{ARGV.join(' ')}", :body => util.get_piped_data ).send
rgrep
#!/bin/bash find "$2" -type f -exec grep --with-filename "$1" "{}" ;
run_erb
#!/usr/bin/ruby require 'utility' print Util.new.get_piped_data.run_erb
save
#!/usr/bin/ruby require 'utility' util = Util.new storage = util.load(:storage) || {} storage[ARGV.join(' ')] = util.get_piped_data util.save(:storage, storage)
search
#!/bin/bash open http://www.google.com/search?q=$(echo $@ | sed 's/ /+/g')&num=100
search_code
#!/bin/bash open http://www.google.com/codesearch?as_q=$(echo $@ | sed 's/ /+/g')&num=100
shop
#!/bin/bash open http://froogle.google.com/froogle?q=$(echo $@ | sed 's/ /+/g')&num=100
shorthand
#!/usr/bin/ruby require 'utility' print Util.new.get_piped_data.shorthand
split_into
#!/bin/bash #Splits a file into X-byte chunks. #Usage: split_into nnn[k|m] file split -b$1 $2 $2
subfolders_by_exif_date
#!/usr/bin/ruby require 'fileutils' require 'exifr' ARGV.each do |file| begin date = EXIFR::JPEG.new(file).date_time_original dir = sprintf('%04d-%02d-%02d', date.year, date.month, date.mday) Dir.mkdir(dir) unless File.exist?(dir) FileUtils.mv(file, dir) rescue => exception abort "Error processing #{file}: " + exception.message + "n" + exception.backtrace.join("n") end end
upper_case
#!/usr/bin/ruby STDIN.each{|l| puts l.upcase}
utility
#!/bin/sh ruby -rutility -e "$1"
wikipedia
#!/bin/bash open http://en.wikipedia.org/wiki/Special:Search?search=$(echo $@ | sed 's/ /+/g')
work_note
#!/usr/bin/ruby require 'utility' util = Util.new Utility::Email::Email.new( :senders => [util.load(:home_email)], :recipients => [util.load(:work_email)], :subject => "Note: #{ARGV.join(' ')}", :body => util.get_piped_data ).send
work_reminder
#!/usr/bin/ruby require 'utility' util = Util.new Utility::Email::Email.new( :senders => [util.load(:home_email)], :recipients => [util.load(:work_email)], :subject => "Reminder: #{ARGV.join(' ')}", :body => util.get_piped_data ).send
wrap
#!/opt/local/bin/perl #Get command line options. $wrap_column = $ARGV[0] || 60; #Set up text wrap options. use Text::Wrap; use Text::Tabs; $Text::Wrap::columns = $wrap_column; #Process each input line. LINE: while () { #Clean up line. chomp; #Get existing indentation to use on subsequent lines. if (/^(s+)/) {$indentation = $1} else {$indentation = undef} #Wrap text and print. print expand(wrap(undef, $indentation, $_)) . "n"; }
zyps_download_count
#!/bin/bash curl --silent http://gems.rubyforge.org/stats.html | grep zyps