Schrift
[thread]8316[/thread]

Suchen: Suchen und löschen (Seite 3)

Leser: 1


<< |< 1 2 3 >| >> 30 Einträge, 3 Seiten
Paul
 2006-09-12 15:29
#69705 #69705
User since
2006-09-11
12 Artikel
BenutzerIn
[default_avatar]
Hi Linuxer

habs gemacht wir von vorgeschlagen, jetzt gibts auch eine Fehlermeldung. ???  

Code: (dl )
1
2
3
129510528832.log.log: No such file or directory
129510528832.log.inx: No such file or directory
129510528832.log.pdf: No such file or directory


Gruss

Paul\n\n

<!--EDIT|Paul|1158060614-->
fraggs
 2006-09-12 15:38
#69706 #69706
User since
2006-09-11
179 Artikel
BenutzerIn
[Homepage] [default_avatar]
der error kommt wie die fehlermeldung sagt von nem falschen file name ...

der code versucht irgendwie nummern.log.inx oder nummern.log.pdf auf zurufen? soll der das tun ?
ich denke der sollte eher einfach nur .pdf oder .inx oder .log auf rufen

poste jetzt mal den ganzen code dann kann man mal sehn woher das .log. kommt


EDIT: ich habs
Code: (dl )
1
2
3
4
for my $extension ( qw/log inx pdf/ ) {
my $delete_me = $basename'.'$extension;
unlink $delete_me or warn "$delete_me: $!\n";
}


probier mal mal sehen ob das klappt wenn nicht wieder umschreiben und testen wo es haengt. ich denke es light mit der basename und extension zusammensetztung zusammen das da sich noch so ein log rein mogelt\n\n

<!--EDIT|fraggs|1158062018-->
mmm twix
Paul
 2006-09-12 16:08
#69707 #69707
User since
2006-09-11
12 Artikel
BenutzerIn
[default_avatar]
Hi fraggs

klappt nicht so wie es soll. Jetzt habe ich zwar ne Fehlermeldung, aber die macht mich auch nicht schlauer.

Code: (dl )
1
2
3
4
5
String found where operator expected at ./loeschen3.pl line 39, near "$basename '.'"
       (Missing operator before '.'?)
Scalar found where operator expected at ./loeschen3.pl line 39, near "'.' $extension"
       (Missing operator before  $extension?)
syntax error at ./loeschen3.pl line 39, near "$basename '.'"


Frage:
Der Basename, sollte der nicht den Filename darstellen ohne extension, oder habe ich das mal wieder falsch verstanden.
Beim print wird Basename immer mit der extension ausgegeben, und nachher werden die zusätzlichen extensions angehängt.

Gruss

Paul\n\n

<!--EDIT|Paul|1158062987-->
Linuxer
 2006-09-12 16:10
#69708 #69708
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
Falls die Benennung der Dateien korrekt ist, könnte auch das Problem das folgende sein:
Du stehst bei Skriptausführung nicht im Verzeichnis, wo die zu löschenden Dateien liegen.
Dadurch kann unlink auch keine Datei finden und löschen.

Variante 1: wechsel in das Verzeichnis, in dem die zu löschenden Dateien liegen
Variante 2: füge den Verzeichnispfad dem Pfad der zu löschenden Datei hinzu.

@fraggs:
Quote
my $delete_me = $basename'.'$extension;


Ich mag es falsch deuten, aber was soll ausser Syntaxfehler (fehlender Operator) das Ergebnis dieser Zeile sein?
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
nepos
 2006-09-12 16:15
#69709 #69709
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Basename liefert nicht den Dateinamen ohne Endung, sondern den Dateinamen oder den Pfad dazu. Beispiel:
Code: (dl )
perl -MFile::Basename -e 'print basename("/etc/apache/httpd.conf");'
liefert nur httpd.conf zurueck.
In deinem Fall muesstest du statt basename zu benutzen wohl eher die Endung abschneiden, bevor du in deiner for-Schleife die anderen Endungen dazupackst.

Ach ja, ein weiteres Problem mit basename: Perl wird die zu loeschenden Dateien dann wohl nicht finden, da es im aktuellen Verzeichnis nachsieht und nicht da, wo geloescht werden soll ;)
Paul
 2006-09-12 16:18
#69710 #69710
User since
2006-09-11
12 Artikel
BenutzerIn
[default_avatar]
Die Benennung der Dateien sollte korrekt sein und im richtigen Verzeichnis bin ich auch.
Habe einen print eingebaut.

Code: (dl )
1
2
3
4
5
for my $extension ( qw/log inx pdf/ ) {
my $delete_me = $basename . '.' . $extension;
         print "Basename $basename gefunden\n";
unlink $delete_me or warn "$delete_me: $!\n";
}


und folgendes Ergebnis:
Code: (dl )
1
2
Basename 129510528832.log gefunden
129510528832.log.pdf: No such file or directory


Es wird an den Basename einfach die zusätzlichen extensions angehängt.

Gruss

Paul
Dubu
 2006-09-12 16:25
#69711 #69711
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=fraggs,11.09.2006, 15:02]
Code: (dl )
1
2
3
4
5
sub delete_files{
  my ($dir,$name) = @_;
  my ($basename) = basename($name);
  unlink $basename.'.'.$_ for(qw(log inx pdf));
}
[/quote]
Falshce Verwendung von File::Basename::basename().
Wenn man keine Suffixe angibt, werden auch keine abgeschnitten, also bleibt das .log dran. Andererseits würde ein Pfad vor dem Dateinamen abgeschnitten, wenn er denn da wäre - aber $dir wird ja komplett ignoriert, also werden so oder so nur Dateien im aktuellen Verzeichnis gelöscht. Hmm...

Wie wär's damit?
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
sub delete_files{
   my ($dir,$name) = @_;
   # Endung .log abschneiden
   unless ($name =~ s/\.log$//) {
       warn "$name endet nicht auf .log, nichts gelöscht.\n";
       return;
   }
   for my $suffix (qw/log inx pdf/) {
       my $filepath = "$dir/$name.$suffix";
       unlink $filepath or warn "kann $filepath nicht löschen: $!\n";
   }
}

(ungetestet)

Wenn man's ganz ordentlich machen möchte, dann kann man die Dateipfade mit File::Basename und File::Spec zerpflücken und wieder zusammensetzen, aber dann bitte auch schon bei $dir im aufrufenden Programmteil.
Linuxer
 2006-09-12 16:28
#69712 #69712
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
@Paul
basename($pfad) liefert bei diesem Aufruf das letzte Element einer Pfadangabe (egal ob Datei oder Verzeichnis). Die Endung einer Datei wird dabei nicht entfernt!

Entweder passe den Aufruf von basename gemäß Perldoc File::Basename an, oder ersetze die Endung manuell:

Code: (dl )
1
2
3
4
5
6
for my $extension ( qw/log inx pdf/ ) {
# ersetze die extension;
substr($basename,-3,3,$extension);

unlink $basename or warn "$basename: $!\n";
}

Das ganze ist zwar etwas overhead, weil einmal pro schleife die Endung log durch die Endung log ersetzt wird; aber es ist einheitlich ...
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
renee
 2006-09-12 16:29
#69713 #69713
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Mach mal aus:
Code: (dl )
  my ($basename) = basename($name);


ein:
Code: (dl )
  my ($basename) = $name =~ m!/([^/]+)\..*?$!;


(ungetestet)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Paul
 2006-09-12 16:47
#69714 #69714
User since
2006-09-11
12 Artikel
BenutzerIn
[default_avatar]
Besten Dank an alle die mir hier geholfen haben, ich werde alle Varianten ausprobieren, aber bei mir geht das nicht mehr ganz so schnell. Vermutlich eine Altesfrage(bin immerhin schon ein halbes Jahrhundert alt und beginne erst mit Perl).

@dubu
Dein Code funktioniert ohne Probleme

@Linuxer @renee
Werde natürlich auch diese Möglichkeiten durchspielen.

Nochmals Dank an alle

Paul
<< |< 1 2 3 >| >> 30 Einträge, 3 Seiten



View all threads created 2006-09-11 16:00.