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

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.

···

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

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 ?

--
Ceterum censeo Internet Explorer esse delendam.

Hi,

···

-----Original Message-----
From: Mariusz Pekala [mailto:skoot@ideico.net]
Sent: Thursday, June 14, 2007 11:26 AM
To: ruby-talk ML
Subject: Re: Dir copy with rename

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

now i have

src="Y:/test"

re=/foobar/
sub="foobaz"

Dir[src+'/**/**/**'].each { |old|
  next if old == '.'||old== '..'||old =~ /\./
  puts old
  if re.match(old)
    new = old.sub(re,sub)
    File.rename(old,new)
    end
}

when i use Dir[src] the /foobar folder on first
level, means Y:/test/foobar gets Y:/test/foobaz and Exit 0

but when i use Dir[src+'/**'], because i want to recurse
in all subfolders

the folder on first level gets renamed and then i get an error =

ruby dircopy.rb

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)

Regards, Gilbert

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

···

On 14.06.2007 11:53, Rebhan, Gilbert wrote:

Hi,

-----Original Message-----
From: Mariusz Pekala [mailto:skoot@ideico.net] Sent: Thursday, June 14, 2007 11:26 AM
To: ruby-talk ML
Subject: Re: Dir copy with rename

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

now i have

src="Y:/test"

re=/foobar/
sub="foobaz"

Dir[src+'/**/**/**'].each { |old|
  next if old == '.'||old== '..'||old =~ /\./
  puts old
  if re.match(old) new = old.sub(re,sub)
    File.rename(old,new)
    end
}

when i use Dir[src] the /foobar folder on first
level, means Y:/test/foobar gets Y:/test/foobaz and Exit 0

but when i use Dir[src+'/**'], because i want to recurse
in all subfolders

the folder on first level gets renamed and then i get an error =

ruby dircopy.rb

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)