Schrift
[thread]12883[/thread]

Probleme beim Zuweisen von Strings



<< >> 7 Einträge, 1 Seite
Reisser696
 2008-12-09 19:44
#117006 #117006
User since
2008-04-25
10 Artikel
BenutzerIn
[default_avatar]
Ich rauf mir hier gerade ein wenig die Haare - vielleicht kann mir ja jemand helfen (meine letzten Zotteln zu behalten).

Ich habe hier einen Perl-Script mit dem ich Verzeichnisse nach bestimmten Dateiendungen durchsuchen möchte und die dazu gehörigen Daten dann auf ihr Alter prüfen will um sie dann ggf zu löschen.

Z.B über den Aufruf: cleanup.pl txt /home/

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/perl
use strict;

# Alter der Dateien in Sekunden angeben
my $age =  50000; # In Sekunden angeben!

# Endung wird dreistellig übergeben
my $ending = ($ARGV[0]);

# Pfad wird übergeben
my $path = ($ARGV[1]);

# Arbeitsverzeichnis für temporäre Dateilisten
my $workdirectory = "/home/edv";

# Logverzeichnis für gespeicherte Daten
my $savedirectory = "/var/log";

# Counter auf Null setzen
my $counter = 0;

# Sicherheitsausgabe
print "\nSuche alle Dateien mit Endung: $ending im Pfad: $path\n\n"; 

# Liste mit zu überprüfenden Dateien erstellen
system("find $path -type f -name \*.$ending > $workdirectory/cleanup.list");

# Datei einlesen
open (DATEI, "$workdirectory/cleanup.list") || die "Datei nicht gefunden";

foreach my $line ( <DATEI> ) 
{ 
        $counter++;     
        # Dateistatistik mittels stat bestimmen
        my @stat = stat($line);
        print "Letzte Zugriffszeit:$stat[8]\n";
        # JA/NEIN (True/False) Wert
        if ((time - $stat[8]) > $age) 
        { 
                # Dateien loeschen per unlink
                print "Gelöscht:$line";
                unlink($line);
        }               
}       
close (DATEI);

print "\nDateien:$counter\n\n";


Das ganze ist gerade im oberen Teil nicht hübsch - naja - funktioniert aber. Es handelt sich um ein paar tausend Dateien die auf den Servern liegen nebenbei.

Im unteren Teil liegt dann der Hase im Pfeffer.

Ich kann zwar ganz locker Zuweisungen wie

my @stat = stat("/home/edv/test.txt);

per Hand machen - dort kann er ein Stat auslesen.

Sobald aber genau der gleiche Ausdruck im String $line enthalten ist (print zeigt genau diese Ausgabe) bekomme ich nur eine 0 bzw nichts als Output. Also eben das hier:

my @stat = stat($line);

print($line); zeigt aber dennoch /home/edv/test.txt

Gleiches gilt für den unlink ganz unten. Auch hier: wenn ich einen "festen" Stringausdruck einfüge klappts - sobald das ganze im String ist nicht mehr.

Abschließende Frage bevor ich hier hinwerfe: wie bekomme ich es hin dass der String richtig zugewiesen wird?
Signaturen werden völlig überbewertet
betterworld
 2008-12-09 19:53
#117007 #117007
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Zunächst mal solltest du "use warnings;" benutzen, dann solltest Du für den Fall, dass stat (oder unlink oder ...) nichts zurückgibt, einen Fehler und $! ausgeben und am besten das Programm abbrechen.
Und wenn Du bei "print $line" mal genau hinguckst, wirst Du sehen, dass ein Zeilenumbruch danach ausgegeben wird. Mit chomp kriegst Du ihn weg, sodass Du auch wieder statten kannst.
Reisser696
 2008-12-09 19:59
#117010 #117010
User since
2008-04-25
10 Artikel
BenutzerIn
[default_avatar]
Au verdammt ... chomp ... das hatte ich doch schonmal *hier ein smiley der sich vor den kopf schlägt*

Das schaut nun ja doch schon viel besser aus!

Und warnings sind auch eigentlich keine schlechte Idee

Danke für die schnelle Hilfe - der Feierabend ist gerettet! ;)
Signaturen werden völlig überbewertet
pq
 2008-12-09 20:05
#117011 #117011
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
wieder mal ein fall für Data::Dumper:
Code: (dl )
1
2
3
4
5
6
7
8
9
perl -we'
use Data::Dumper;
$Data::Dumper::Useqq = 1;
$line = "datei.txt\n";
print "$line\n";
print Dumper $line;'
datei.txt

$VAR1 = "datei.txt\n";

in der normalen print-ausgabe kann einem das newline leicht entgehen.
immer Data::Dumper zum ausgeben von variablen nehmen, wenn man nicht
weiterkommt.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Gast Gast
 2008-12-09 20:28
#117012 #117012
Ganz neben bei aus der ManualPage von find:
Code: (dl )
1
2
3
4
5
       -amin N
auf die Datei ist vor N Minuten zugegriffen worden

-atime N
auf die Datei ist vor N*24 Stunden zugegriffen worden


Weiterhin, das Shell Script macht das selbe, was dein Script macht:

Code: (dl )
1
2
3
4
5
6
7
8
9
#!/bin/bash
# Alter der Dateien in Minuten angeben
age=833
# Endung wird dreistellig übergeben
ending = $1
# Pfad wird übergeben
path = $2

find $path -iname '*.$ending' -amin $age -exec echo -n "Gelöscht: " \; -exec rm {} \; -print


Aber du könntest auch File::Find nutzen...
betterworld
 2008-12-09 20:57
#117013 #117013
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Gast+2008-12-09 19:28:00--
Weiterhin, das Shell Script macht das selbe, was dein Script macht:

Code: (dl )
1
2
3
4
5
6
7
#!/bin/bash
# Alter der Dateien in Minuten angeben
age=833
# Endung wird dreistellig übergeben
ending = $1
# Pfad wird übergeben
path = $2

Nope.. man macht in Shell keine Leerzeichen um Gleichheitszeichen.

Quote
Code: (dl )
find $path -iname '*.$ending' -amin $age -exec echo -n "Gelöscht: " \; -exec rm {} \; -print


Aber du könntest auch File::Find nutzen...

Um $path sollte man hier Doublequotes machen. Waren zwar im system-Befehl vom OP auch nicht (bei system sollte man stattdessen die Mehrere-Argumente-Form benutzen, Wiki:siehe Wiki), aber wenn wir es schon besser machen wollen...

File::Find ist jedenfalls ein guter Tipp.
Linuxer
 2008-12-10 07:14
#117024 #117024
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Und ich würde überprüfen, ob $1 und $2 jeweils wirklich einen Wert enthalten.
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!
<< >> 7 Einträge, 1 Seite



View all threads created 2008-12-09 19:44.