From: Rob Biedenharn Date: 2007-09-28T22:17:15+09:00 Subject: Re: Recursing through directories On Sep 28, 2007, at 5:04 AM, Gabriel Dragffy wrote: > On 27 Sep 2007, at 16:35, Rob Biedenharn wrote: >> If you want to rename files having names that meet some pattern, >> why don't you start with print the names like this (files having >> "foo" somewhere in their name): >> >> Dir['**/*'].each {|f| puts f if f =~ /foo/ } >> >> but beware that Dir['**/*'] is going to plow through the directory >> structure and make an array (a big one) of all the file names >> before the block gets to see any of those names. >> >> Perhaps you'd get some better answers if you post what you're >> trying to accomplish, the attempt you've made (or what you think >> should work), and the actual results you see. >> >> Also, note that my example starts from the current directory >> (which was ~/ in my case). It's always better to get a script >> like yours working on a small bit of known data (and perhaps be >> non-destructive) before turning it loose on your entire disk. (In >> my case, it found many files that were throwaway "foo" files, but >> also many with "foot", "footnote", "food", and "footer" that were >> clearly not throwaway files.) > > Hi Rob > > Thanks for your help. > > What I am trying to achieve is replace the slashes (/) in file/ > directory names under a certain directory. So, for example, I want > to recursively rename offending files that are under /Volumes, but > I don't want them moved from their current directory... just > renamed. What's the best way to go about that? > > Regards > > Gabe This doesn't make sense. There aren't slashes in the name, those are separating directories along the path to the file. /Volumes/Macintosh HD/Users/rab/code/ruby/quiz/081-Hash to OpenStruct/ another.yml /Volumes/Macintosh HD/Users/rab/code/ruby/quiz/081-Hash to OpenStruct/ hash2ostruct.rb /Volumes/Macintosh HD/Users/rab/code/ruby/quiz/081-Hash to OpenStruct/ openstruct.yml /Volumes/Macintosh HD/Users/rab/code/ruby/quiz/081-Hash to OpenStruct/ recursive.yml These files have some directories containing spaces in the name, but the name of each file is just the last part (another.yml, hash2ostruct.rb, openstruct.yml, recursive.yml). If I go to my home directory and rename 'code' to be 'source', I haven't changed the names of the files, but I *have* changed the path needed to reach them. If you really *do* have files with '/' in their names, chances are you need to use a low-level utility to recover from that mess. If you're just seeing in the Mac OS X Finder that there are "slashes" in the name of a file, perhaps you're seeing an artifact of the Mac's filesystem. If you open a Terminal, you'll see that there the file has a ':' in the place that Finder shows you '/'. Perhaps you can find these files (like I said, see if you find them properly before to operate on them) with Ruby like this: ruby -e 'puts Dir["**/*:*"]' But know that there are a great many files that *NEED* to contain ':' created by iChat, AddressBook, Safari, and others. (You might not want to mess with anything under a Library directory ;-) -Rob Rob Biedenharn http://agileconsultingllc.com Rob@AgileConsultingLLC.com