[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Dir copy with rename

Rebhan, Gilbert

6/14/2007 7:02:00 AM


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

3 Answers

Mariusz Pekala

6/14/2007 9:26:00 AM

0

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 ?

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.

--
Ceterum censeo Internet Explorer esse delendam.

Rebhan, Gilbert

6/14/2007 9:53:00 AM

0


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

Robert Klemme

6/14/2007 10:03:00 AM

0

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)

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