Another ruby rtouch

2009-03-17

Well, I decided it wasn’t really fair to criticize ruby for lacking a variable-time touch command when Perl doesn’t have one either. So I wrote a ruby version that uses utime just as the Perl version. Here it is:

#!/usr/bin/env ruby

# == Synopsis
#
# rtouch: recursively touch files.
#
# == Usage
#
# rtouch [OPTIONS] file [files...]
#
# -h, --help
#   show help
#
# -t, --time [[CC]YY]MMDDhhmm[.SS]
#   use the given time instead of the current time
#
# files: the files to create or touch.
# If directories, rtouch will update their time and everything within them.

require 'find'
require 'FileUtils'
require 'getoptlong'
require 'rdoc/usage'

def parse_time(tstr)
  if tstr =~ /^(\d\d\d\d|\d\d)?(\d\d)(\d\d)(\d\d)(\d\d)(\.(\d\d))?$/
    if $1
      if $1.length == 2
        year = $1.to_i + ((Time.new.year / 100).floor * 100)
      else
        year = $1
      end
    else
      year = Time.new.year
    end
    secs = $7 ? $7 : 0
    return Time.local(year, $2, $3, $4, $5, secs)
  else
    raise "bad time parameter"
  end
end

opts = GetoptLong.new(
            [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
            [ '--time', '-t', GetoptLong::REQUIRED_ARGUMENT ]
           )

time = Time.new
begin
  opts.each do |opt, arg|
    case opt
    when '--help'
      RDoc::usage 0
    when '--time'
      time = parse_time arg
    end
  end
rescue Exception
  puts $!
  RDoc::usage 1
end

if not ARGV.length > 0
  RDoc::usage 1
end

ARGV.each do |dir|
  if File.exists? dir
    Find.find(dir) do |path|
      File::utime time, time, path
    end
  else
    FileUtils.touch dir
    File::utime time, time, dir
  end
end
blog comments powered by Disqus Prev: ruby linkcheck Next: Simple Wordpress Hit Counter Plugin