Am Mittwoch, 11. Februar 2004 11:29 schrieb Dirk: [...]
Hm... Wenn ein Skript doch mal da ist, kann man's immer wieder verwenden. Einfach nur die Strings ändern, und laufen lassen.
Mein Vorschlag:
(Skript als "replace.pl" speichern, $search und $replace anpassen und mit "perl replace.pl" in dem Verzeichnis laufen lassen, das ^^^^ nicht notwendig, Du hast ja eine Shebang-Zeile am Anfang.
durchsucht werden soll)
----- snip ------------------------- #!/usr/bin/perl ############################################### # # Skript "replace.pl" durchsucht rekursiv alle # Dateien und Verzeichnisse, und ersetzt # gegebenenfalls $search durch $replace # ###############################################
# hier sollte noch mindestens: use strict; use warnings; # rein, damit Du Fehler auch sehen kannst und zu sauberer # Deklaration der Variablen gezwungen wirst. # Dann kriegst Du folgendes zu sehen: <schnipp> Global symbol "$search" requires explicit package name at ./replace.pl line 18. Global symbol "$replace" requires explicit package name at ./replace.pl line 19. Global symbol "$extension" requires explicit package name at ./replace.pl line 24. BEGIN not safe after errors--compilation aborted at ./replace.pl line 28. <schnapp> # Du arbeitest in wildem Mix mit Daklarationen, die eine # Gültigkeit definieren (my) und mit solchen globalen Deklarationen. # Das ist unsauber, Du merkst nicht, wenn Du vorher definierte # Variablen überschreibst.
# # Such-/Ersetzungsstrings $search = "irgendwas"; $replace = "das soll rein"; # ############################################### # und hier, welche Dateiendungen gesucht # werden sollen (Wildcards sind möglich) $extension=".htm*";
# diese Extension matcht auf alles, was im Dateinamen ein Muster
# der Form: <beliebiges Zeichen>ht
# ###############################################
use Time::Local; use File::stat; use File::Find;
$rtot=0; print "\nScanning $extension files ... \n\n"; @ARGV = ('.') unless @ARGV; find(\&filesearch, @ARGV); print "\n$i $extension files found, $rtot replacements
# siehe oben: durch die fehlende Deklaration und Initialisierung # von $i kriegst Du hier ne merkwürdige Meldung, wenn keine # Dateien gefunden werden.
made!\n\n";
sub filesearch { my (@source,@target,@file)=(); $tmp = $File::Find::name;(@file)=split(/\//,$tmp);
# 1 Anweisung / Zeile, das ist sauberer Stil # Warum ein Array @file, wenn Du nur die Dateinamen brauchst? # nimm basename
if (-f && $file[-1] && $file[-1] =~ /$extension/ && $file[-1]
# ^^^^^^^^^^^^^^^ was soll das machen? Meinst Du nicht eher: if (-f $file[-1] && $file[-1] =~ /$extension/ && $file[-1] # außerdem sollte man hier tatsächlich nach der _Endung_ suchen: if (-f $file[-1] && $file[-1] =~ /$extension$/ && $file[-1]
!~ /^replace\.pl$/){ $i++; print " $i: Opening $tmp ... "; open SOURCE,"<$file[-1]";
# knallt, wenn Du kein Recht hast, die Datei zu lesen. # Abfangen!
@source=<SOURCE>; close SOURCE; $r=0; foreach (@source) { if ($_ =~ /\Q$search\E/){
# David hatte Dich in der anderen Mail schon drauf hingewiesen, $_ # ist meist Default. Hier geht also auch kürzer: if (/\Q$search\E/){
$r++;$rtot++;
# 1 Anweisung / Zeile, das ist sauberer Stil
$_ =~ s/$search/$replace/g;
s/$search/$replace/g;
} push @target,$_; } close TARGET;
# Du machst hier TARGET zu, ohne es vorher zu öffnen. Warum?
if ($r > 0) { open TARGET, ">$file[-1]";
# knallt, wenn Du kein Recht hast, die Datei zu schreiben. # Abfangen!
print "--> replacements: $r\n"; print TARGET @target; close TARGET; } else { print "nothing to do\n"; } } } ----- snap -------------------------
Das Skript ist bei mir schon seit Jahren im Einsatz, und hat mir schon ziemlich viel Arbeit abgenommen.
So? Kann ich mir nicht richtig vorstellen, es sei denn, Du hast bisher großes Glück mit den Dateinamen und -rechten gehabt. ;-)
Wichtig ist, das Skript wirklich als "replace.pl" abzulegen. Heißt es anders, durchsucht es sich selber. Wer will kann ja noch diese nette "basename"-Abfrage einbauen.
Nicht nur basename, auch dirname, ggf. Pfad des Scripts gegen die Pfade prüfen - kann ja sein, dass es nicht nur 1 replace.pl gibt und eine Bearbeitung durchaus gewollt ist. Jan