Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11621[/thread]

Dateien und Verzeichnisse überprüfen



<< >> 10 Einträge, 1 Seite
Gast Gast
 2008-04-11 13:21
#108223 #108223
hi perl-community ;)

bin ein totaler perl-anfänger, habe aber direkt ein backup perl-script zu schreiben.

grundlegendes vorne weg:
- betriebssystem: windows xp + activeperl
- editor: eclipse + epic

und zwar soll das script folgendes können:
1. durchsucht ein verzeichnis auf dateien und unterverzeichnisse (kurz gesagt, jede datei auf dem datenträger soll erfasst werden)
2. auslesen der last access time (zeitstempel) aller gefundenen dateien
3. sofern die datei längere zeit (angenommen mal 2 jahre) nicht geöffnet wurde, soll diese vom backup/kopiervorgang ausgeschlossen werden

das ganze klingt für perl-kenner sicherlich nach peanuts, aber für mich als perl- und generell programmier-anfänger ist das schon ein hartes stück ;) ...

ich habe damit begonnen erstmal herauszufinden, wie ich timestamps von dateien erfasse, wurde da auch fündig, aber bereits dort ergeben sich erste probleme...

Code: (dl )
1
2
3
4
5
$datei = "D:\\PERL\\TESTDAT\\datei1.dat";
@a = stat($datei);

print("$datei\n");
print("\t Letzter Zugriff: $a[8]\n");


die ausgegebene zeit ist die unix zeit (sekunden seit 1970), aber ich möchte die zeitangabe gerne in dd.mm.yyyy hh:mm:ss (kurz gesagt, wie windows die zeitstempel von dateien ausgibt).
mir fehlt da irgendwie die logik, das ausgabeformat zu "konvertieren". was muss ich anstellen, um dies zu bewerkstelligen?

habe auch schon per perl package manager nach brauchbaren modulen gesucht und auch nix gefunden.

mir fehlt aber auch komplett die übersicht, wie ich überhaupt einen ordner auf dateien und unterverzeichnisse prüfen kann. habe hier zwar einige perl-lektüren, aber die beschäftigen sich nicht mit sowas.

kurz gesagt: ich habe absolut keine anhaltspunkte, wie ich das ganze script/programm umsetzen soll.

ich würde mich über jegliche denkanstöße und jeglichen code/methoden/module freuen, die mir helfen/die ich benötige, um dieses script überhaupt erstellen zu können.

danke schonmal im voraus.

grüße
GwenDragon
 2008-04-11 13:28
#108224 #108224
User since
2005-01-17
14749 Artikel
Admin1
[Homepage]
user image
renee
 2008-04-11 13:40
#108225 #108225
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Zum Durchsuchen des Ordners, solltest Du CPAN:File::Find verwenden...


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl

use strict;
use warnings;
use File::Find;

my @files;
my $dir = 'C:\test';
find( \&search, $dir );

print "Alle Dateien, deren 'last modified' Datum länger als 2 Jahre zurückliegt:\n";
print "  $_\n" for @files;

sub search{
    my $file = $File::Find::name;
    if( $last_modify_date > $2_jahre ){
        push @files, $file;
    }
}


Mehr zu use strict findest Du in diesem Wiki:Artikel
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/
Gast Gast
 2008-04-11 13:41
#108226 #108226
jo, darüber bin ich auch schon gestolpert. allerdings gibt das doch das aktuelle datum aus.
ich weiß nicht so wirklich wo und wie ich dort meine ausgelesene last access time des files übergebe :(
renee
 2008-04-11 13:51
#108227 #108227
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
my $accesstime = (stat $file)[8];
my $human_readable_date = localtime $accesstime;


Wenn Du localtime im Listenkontext aufrufst, erhälst Du nicht einen String, sondern die einzelnen Informationen zu Tag, Monat, Jahr usw... (siehe auch die Doku zu localtime)

Die kannst Du ja für die "schöne" Ausgabe des Datums verwenden.
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/
nepos
 2008-04-11 14:08
#108228 #108228
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Um den Zeitstempel in das von dir gewuenschte Format zu bringen, kannst du aus CPAN:POSIX die Funktion strftime benutzen:
Code (perl): (dl )
1
2
3
use POSIX qw(strftime);
my $accesstime = (stat $file)[8];
my $human_readable_date = strftime("%d.%m.%Y %H:%M:%S", $accesstime);
Gast Gast
 2008-04-11 17:32
#108233 #108233
schon einmal danke. das hat mir sehr geholfen. :)

kann jetzt schon verzeichnisse samt unterverzeichnissen durchsuchen und von einzelnen dateien (dank localtime) die stat-daten mit gewollter formatierung erfassen.

muss jetzt noch die einzelnen teile, die ich bisher schon habe, zusammensetzen und langsam anfangen mir über irgendwelche schleifen für all die abläude gedanken zu machen.

in diesem sinne: schönes we und ich werd wohl sicherlich noch öfter wegen dem script hier fragen stellen :P
Gast Gast
 2008-04-16 13:23
#108451 #108451
nachdem ich mich in perl eingearbeitet hatte und mit versch modulen umgehen konnte, habe ich das script wie gewollt hinbekommen.

allerdings soll das script nun noch weitere dinge können:
- ausgeben der daten in einer .csv-datei

codeschnipsel vom relevanten script-teil (gekürzt):

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
find( \&search, $dir );
print "  $_\n" for @files;

if($createlog == 1){
        my $log = "$logname";
        open(INFO, ">$log");
        print INFO "  $_\n" for @files;
        close (INFO);
        if(-e $log){
                print "\nDateipfade gespeichert in $logname\n";
        }

sub search{
        my $file = $File::Find::name;
        my @a = stat($file);
        my $laTag = $a[8] / 60 / 60 / 24;
        my $now = time;
        my $nowTag = $now / 60 / 60 / 24;
        my $diff = $nowTag - $laTag;
        if (-f $file){
                $countall++;
                if( $diff > $age ){
                        push @files, $file;
                $count++;
                }       
        }
}


es werden also alle dateien, die dem kriterium "letzter zugriff liegt länger als $age tage zurück" ausgegeben und in einem logfile gespeichert.

wie aber oben bereits erwähnt soll das ganze nun (zusätzlich) in eine .csv-datei geschrieben werden (soll-zustand: VERZEICHNIS;DATEINAME;ERSTELLDATUM;LETZTE ÄNDERUNG;LETZTER ZUGRIFF in .csv-datei)

ich stehe nun jedoch vor dem problem, dass ich nicht weiß, wie ich die ausgabe so hingehend ändern und speichern kann, dass eine .csv-datei zustande kommt.
denn ich muss so viele dinge voneinander trennen, dass ich garnicht weiß was wo wie ;)
die derzeitige ausgabe ist zb. "D:/TEST/HALLO/foo.dat". nun müsste ich hier ja den verzeichnisnamen vom dateinamen trennen.
-> D:/TEST/HALLO/ soll als VERZEICHNIS angezeigt werden
-> foo.dat als DATEINAME

wie bewerkstellige ich das?

für das ermitteln von ERSTELLDATUM, LETZTE ÄNDERUNG sowie LETZTER ZUGRIFF habe ich schon eine idee (localtime), allerdings habe ich auch hier das problem, dass ich nicht weiß wie ich diese samt separatoren (;) in die csv-datei schreiben kann.

nochmal danke für jegliche tipps :)
nepos
 2008-04-16 13:51
#108454 #108454
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Zum Aufteilen des Dateinamens in Verzeichnis und Datei kannst du das Modul CPAN:File::Basename benutzen:
Code (perl): (dl )
1
2
my $file = '/home/bla/fasel.txt';
my ( $filename, $dirname ) = fileparse($file);


Alternativ gibts in diesem Modul auch noch die Funktionen basename() und dirname. Diese geben aber nicht immer das richtige zurueck (siehe auch die Doku zu File::Basename).

Generell solltest du die diversen File-Module benutzen, da sie das ganze unabhaengig vom verwendeten Betriebssystem koennen (insbesondere auch CPAN:File::Spec).

Zum sicheren Erzeugen von CSV-Dateien kannst du dir mal CPAN:Text::CSV ansehen.
Gast Gast
 2008-04-17 15:00
#108505 #108505
File::Basename hat mir sehr geholfen, danke!

allerdings habe ich das erstellen der csv-datei nun manuell programmiert.
<< >> 10 Einträge, 1 Seite



View all threads created 2008-04-11 13:21.