rendered paste body#!/usr/bin/ruby# $*.each {|x| puts(x)}# ©2003 Andrew Jones #Usage: descent-linker <target directory for new links> <directory 1> <directory 2> ... <directory n># Objectives: # 1. Take a list of directories to build on command line# 2. make a directory "dirname.links" for each directory on command line# 3. populate with subdirectories for each album and so on.module Descent # init # calls safe_mkdir for command line entries, creates <foo>.links for each. def Descent.init #@targets = $* #@targets.each {|argument| safe_mkdir( target )} safe_mkdir( $*[0] ) end # safe_mkdir # makes directories and catches already-existing-directory errors def Descent.safe_mkdir( dirname ) begin Dir.mkdir( dirname ) rescue Errno::EEXIST #puts( dirname + " exists; not creating" ) end end def Descent.handle_file( dirname_original, filename, dirname_target ) if filename == "." puts("Doing nothing for '.'") elsif filename == ".." puts("Doing nothing for '..'") else stuff = filename.split(pattern=" - ") artist = stuff[0] album = stuff[1] safe_mkdir( dirname_target + "/" + artist ) if filename == ".links" puts("Doing nothing for an annoying bug; tough shit.") return else begin safe_mkdir( dirname_target + "/" + artist + "/" + album) rescue TypeError puts("Bad file name:") puts("#{dirname_target} #{artist} #{album}") puts("#{filename}") return end end begin #File.link( dirname_original + "/" + filename , dirname_target + "/" + artist + "/" + album + "/" + stuff[2..-1].join(" - ")) `ln -s "#{dirname_original + "/" + filename}" "#{ dirname_target + "/" + artist + "/" + album + "/" + stuff[2..-1].join(" - ")}"` puts("Linking #{filename}, exit status #{$?}") rescue SystemCallError #puts("Doing nothing for #{filename}") return end end end # parse_directory # real def Descent.parse_directory( dirname_original, dirname_target ) original = Dir.new( dirname_original ) #dirname_target = dirname_original + ".links" puts("Processing directory #{dirname_original}; creating links in #{dirname_target}") original.each { |filename| handle_file( dirname_original, filename, dirname_target ) } original.close endendif $*.length < 2 puts("Usage: descent-linker <target directory for new links> <directory 1> <directory 2> ... <directory n>") exitendDescent.init()$*[1..-1].each {|argument| Descent.parse_directory( argument, $*[0] )}