From: ara.t.howard@... Date: 2006-02-17T13:06:40+09:00 Subject: Re: Ruby script to Module/Class refactor On Fri, 17 Feb 2006, William James wrote: > William James wrote: >> James B. Byrne wrote: >> >>> # find, move and optionally rename data files that match glob expression >>> # provided. >>> # >>> # ruby mv2dir.rb source_dir glob_exp [target_dir=./] [ext] >> >> # ruby mv2dir.rb source_dir glob_exp target_dir >> require 'fileutils' >> Dir[ File.join(ARGV[0], "*") ].select{ |p| >> Regexp.new(ARGV[1]).match File.basename( p ) }.each{ |p| >> FileUtils.move( p, ARGV[2] ) } > > Please pardon previous prolixity. > > require 'fileutils' > FileUtils.move Dir[ File.join(ARGV[0], "*") ].select{ |p| > Regexp.new(ARGV[1]).match File.basename( p ) }, ARGV[2] a glob is not a regexp harp:~ > irb irb(main):001:0> Dir::glob "*.{jpg,png}" => ["mqmapgend.png", "tshirt2.png", "tshirt.png", "boulder.png", "map.png", "seg_lights.png"] irb(main):002:0> Dir::glob("*").select{|file| file =~ /*.{jpg,png}/} SyntaxError: compile error (irb):2: invalid regular expression; there's no previous pattern, to which '*' would define cardinality at 1: /*.{jpg,png}/ from (irb):2 from :0 so almost any valid glob will explode the above when it fails to compile as a regexp. also, for large dirs this will be extremely slow since all results are returned at once. best to use the block form of globbing to accomplish this harp:~ > ls *png boulder.png map.png mqmapgend.png seg_lights.png tshirt.png tshirt2.png harp:~ > cat a.rb (src, glob, dst, ext = ARGV) and (dst ||= ".") and (f = File) Dir::glob(f.join(src, glob)){|e| f.rename(e, f.join(dst, f.basename(e) + ext.to_s))} harp:~ > ruby a.rb . '*.png' tmp .bak harp:~ > ls tmp boulder.png.bak map.png.bak mqmapgend.png.bak seg_lights.png.bak tshirt.png.bak tshirt2.png.bak regards. -a -- judge your success by what you had to give up in order to get it. - h.h. the 14th dali lama