Dir copy with rename

Hi,

i want to copy a dir recursive with all files included,
but rename all dirnames that match a pattern, i.e.

/srcdir
/bla/foobar/blabla
/bla/test/subtest/foobar
/foobar/test
/foobar

should be

/targetdir
/bla/foobaz/blabla
/bla/test/subtest/foobaz
/foobaz/test
/foobaz

i tried =

re=/foobar/
sub=“foobaz”

Dir[‘Y:/test//’].each { |old|
next if old == ‘.’||old== ‘…’||old =~ /./
unless /re/.match(old)
new = old.sub(re,sub)
File.rename(old,new)
end
}

the /foobar folder on first level and on second level get renamed, but
it dosn’t
work, when i have /foobar on the third level, means

/foobar/foobar/foobar gets
/foobaz/foobaz/foobar and Exit Code 1

/test/sub3/foobar/foobar gets
/test/sub3/foobaz/foobar and Exit Code 1

Error message i.e. =
No such file or directory - Y:/test/sub3/foobar/foobar or
Y:/test/sub3/foobaz/foobar

Any ideas what’s wrong ?

Regards, Gilbert

On 2007-06-14 16:01:30 +0900 (Thu, Jun), Rebhan, Gilbert wrote:

/foobar

Error message i.e. =
No such file or directory - Y:/test/sub3/foobar/foobar or
Y:/test/sub3/foobaz/foobar

Any ideas what’s wrong ?

Are you sure the code you posted here is the code you really run?

I guess you want ‘if’ instead of ‘unless’, because you want to rename
the file if the re matches, not if it does not.

Second - you should use re.match(old) not /re/.match(old) since ‘re’
variable is already a Regexp.

Having these errors I doubt you would have any file renamed.

Hi,

On 14.06.2007 11:53, Rebhan, Gilbert wrote:

next if old == ‘.’||old== ‘…’||old =~ /./
re=/foobar/

Y:/test/sub3
Y:/test/sub1
Y:/test/foobar
Y:/test/sub3/foobar
Y:/test/sub3/foobar/foobar
dircopy.rb:14:in `rename’:
No such file or directory - Y:/test/sub3/foobar/foobar or
Y:/test/sub3/foobaz/foobar (Errno::ENOENT)

Your basic flaw seems to be that although the subject talks about “copy
with rename” your code actually only renames. That will lead to errors
because you change the original directory tree and thus a file further
down the hierarchy of a renamed folder does not exist any more with the
original file name - hence you cannot rename it. Note that Dir[] first
generates the full list of files, so any changes you do to the
filesystem during iteration will not be reflected in the list.

Cheers

robert