On Mon, Jun 04, 2007 at 02:25:00PM +0200, Hannah Schroeter wrote:
> Hello!
>
> On Mon, Jun 04, 2007 at 02:01:12PM +0200, Marc Espie wrote:
> >[...]
>
> >Don't use for loops with find results, they do not scale well.
> >Also, beware of spaces in file.
>
> >For this kind of thing, I generally use 'while read'
>
> >find . -type f -name \*.htm -print|while read f; do sed s/old/new <"$f"
> >>"$f.new"; done
>
> This isn't safe wrt newlines in file names, either.
newlines in file names are a pretty infrequent occurrence.
In case this could happen, I would do it in perl and get rid of the sed
entirely.
#! /usr/bin/perl
use File::Find;
sub
transform
{
my $filename = shift;
open my $fh, '<', $filename or
die "Problem with $filename: $!\n";
open my $fh2, '>', "$filename.new" or
die "Problem with $filename.new: $!\n";
while (<$fh>) {
s/old/new/;
print $fh2 $_
}
}
find(sub {
return unless -f $_;
return unless m/\.htm$/;
transform($_);
}, '.');
or something like this...