in reply to Re: Problem with Renaming script
in thread Problem with Renaming script

Hi, I am not creating a new directory.

Replies are listed 'Best First'.
Re: Re: Re: Problem with Renaming script
by graff (Chancellor) on May 22, 2003 at 17:59 UTC
    Oh -- sorry, I must have misunderstood. Well, I wonder if there might be some problem about a file being "open" in some sense when you're trying to rename it, and MSWindows not letting you do that... though the code you showed makes this seem unlikely.

    Still, it might be worthwhile to try a different different approach to the problem. Something like:

    my $oldhostname = "whatever"; my $newhostname = shift || "somethingnew"; die "Nothing to do\n" if ( $oldhostname eq $newhostname ); print "changing $oldhostname to $newhostname\n"; open( FLIST, "<file_containing_list_of_filenames" ) or die "Unable to get list of file names to personalize\n"; my @oldfiles = <FLIST>; chomp @oldfiles; my @renamefiles = grep /$oldhostname/i, @oldfiles; s/$oldhostname/$newhostname/gi for @renamefiles; for my $file ( @oldfiles ) { my $newfile = ( $file =~ /$oldhostname/i ) ? shift @renamefiles : "$file.tmp"; open(IN, "<$file") or die "Unable to read $file: $!\n"; open(OUT, ">$newfile) or die "Can't write $newfile:$!\n; while (<IN>) { s/$oldhostname/$newhostname/gi; print OUT; } close OUT; close IN; unlink $file; rename $newfile, $file if ( $newfile eq "$file.tmp" ); }
    Things to note: (1) if you're going to declare lexically scoped variables with "my", declare each variable as you need it, in the block where it will be used, not globally (which kind of defeats some of the value of lexical scoping).

    (2) This approach uses a different strategy than your original -- since it knows it will need to rewrite every file anyway, it'll use a standard filtering approach, using "newhostname" to set the name of the output file where appropriate, then deleting the old file, and renaming the new one back to the original name if that wasn't supposed to change.

    That's not tested, of course, but assuming that you have already taken care of creating the appropriate list of file names for input to the process, and have the host names the way you want, this should take care of the rest of the task.

    (Personally, if it were my machine, I'd probably want to write all the output files to some separate directory, or at least keep the originals intact somehow, so I could confirm that worked okay before blowing away the originals...)