PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : suche perlscript der files via ftp löschen kann



ccc
12.01.2004, 19:07
hallo

suche ein perlscript der alle files,
die mit td* anfangen und älter als eine woche sind,
via ftp auf dem ftp server löschen kann.

es ist eine externe maschine und ich kann nur via ftp verbinden.

gruss
ccc

Steve
13.01.2004, 20:23
schau die NET::FTP an. Damit sollte eigentlich schnell was zaubern lassen, vorrausgesetzt man bekomm irgendwie das alter der Datein damit raus.

Steve

lordlamer
13.01.2004, 22:42
hi!

wenn du dabei noch hilfe brauchst melde dich bei mir. ich glaub da würden wir fix was gezaubert bekommen.

bis dann

ExRevel
13.01.2004, 22:53
Hi...

ist alles richtig was hier gesagt wurde! Du brauchst nur das FTP Modul und dann ein paar der Befehle, eine uebersicht erhaelst du entweder ueber:


man Net::FTP

oder ueber die perldoc wenn sie bei dir installiert ist oder ueber die Perl Core Documentation (http://www.perldoc.com).

Damit kannst du dich per constructor my $ftp->new(...) und $ftp->login() auf dem server einloggen und erhaelst mittels @list = $ftp->dir("/example_dir") ein array das pro element eine datei mit ihren informationen enthaelt, diese kannst du mittels regexp nach namen und alter durchsuchen und die entsprechenden dateien mittels $ftp->delete($file) loeschen.

ciao ExRevel

ccc
05.02.2004, 19:46
danke aber habe noch eine frage:
wie lösche ich alle files, die älter als 7 tage sind ?

gruss
ccc

ExRevel
05.02.2004, 19:59
Du wirst wohl oder übel alle arrayelemente durchsuchen müssen. Du kannst ja mittels:


my $time = localtime();

my @time = split(' ', $time);

Den derzeitigen Tag und Monat bestimmen, der Tag steht in $time[2] und der Monat in $time[1]. Nun solltest du mit ein bisschen nachdenken in der Lage sein selbst eine kleine Routine zu schreiben, die abfragt ob die Datei älter ist als 7 Tage und sie dann gegebenen falls loescht. Wenn es doch schwierigkeiten gibt, dann sag aber ruhig bescheid, dann helfe ich gerne weiter, nur werde ich nicht das script fuer dich schreiben! Bin ja kein Arbeitsbueffel! ;)

ciao Exi

ccc
05.02.2004, 20:09
das verstehe ich, aber komme mit diesen angaben nicht weiter.

danke und gruss
ccc

ExRevel
05.02.2004, 22:14
Nagut, dann gebe ich dir einen etwas umfangreicheren hinweis, der auch für die tage alleine funktioniert, du muesstest es nur noch so anpassen, das es auch auf die monate ruecksicht nimmt. Ist halt nur ein schnelles beispiel, aber mit ein 2 abfragen mehr ist es getan...


#!/usr/bin/perl

use strict;
use Net::FTP;

my @time = split(' ', localtime());

my $host = "host.de";

my $username = "ccc";

my $password = "cccs_pwd";

my $directory = "/";

my $ftp = Net::FTP->new($host, Debug => 0);

if(defined($ftp)){

$ftp->login($username, $password);

$ftp->cwd($directory);

my @filelist = $ftp->dir($directory);

for( my $n = 0; $n < @filelist; $n++){

my @fileinfo = split(' ', $filelist[$n]);

# element 6 enthaelt den tag, 8 den namen
# fuers weitere, 5 den Monat und 7 die zeit.

if( $fileinfo[6]+7 < $time[2] ){

$ftp->delete($fileinfo[8]);
}
}
}

$ftp->quit();


Ich hoffe es hilft dir nun weiter...

ciao Exi

ccc
05.02.2004, 22:22
herzlichen dank !

es hilft sicher weiter.

gruss und schönen abend
ccc

Steve
06.02.2004, 14:43
@ ExRevel

ein foreach ist perliger.

Steve

ccc
06.02.2004, 15:45
hi Steve

was meinst du damit genau?

gruss
ccc

ExRevel
06.02.2004, 16:10
@Steve, das sind die gruende warum ich es einfach halte fuer leute die nicht so viel erfahrung haben, siehe ccc.

@ccc er meinte das ich auch eine foreach schleife statt einer normalen forschleife haette nutzen koennen.



foreach my $n (@filelist){ ... }


ciao

Steve
06.02.2004, 16:10
kann ja mal schreiben was ich anders gemacht hätte.



foreach (@filelist) {
my @fileinfo = split;
...
}


mit dem Datum weiß ich auch nicht. Ich kenne die Rückgabe von dir nicht. Außerdem gibt localtime, sowieso schon eine List zurück deshalb grübele ich die ganze Zeit nach dem Sinn von diesem split. Dann noch ne kleine style-Frage:



my $ftp = Net::FTP->new($host, Debug => 0);

if(defined($ftp)){
...}


würde ich


my $ftp = Net::FTP->new($host, Debug => 0) or die "Could not establish ftp-connection: $!\n";



Steve

ExRevel
06.02.2004, 16:27
Das is schon alles ganz richtig was du da schreibst, aber es geht nicht darum irgendwelche programmiertricks an anfaenger weiterzugeben, ich kann ihm auch programme geben wo er nicht eine zeile versteht, nur sollte man sich an tutorialstandards orientieren, damit er es auch nachvollziehen kann.

Und zu dem localtime(), versuch mal localtime einfach an ein array zu uebergeben, da erhaelst du keine schöne list:


@time = localtime();

print "@time\n";

Gibt dir nur Zahlen aus, nicht das was man sich zum vergleich beim ftp wuenscht.

Und zu dem defined oder dem die... das ist die frage, ich habe den teil aus einem daemon script von mir kopiert, wo ich einen abbruch des programms nicht gebrauch kann nur weil es meinen router mal wieder gekickt hatte, vllt will ja auch ccc es so laufen lassen, das kann man ja nicht wissen.

Naja, ist ja auch nicht der sinn hier darueber zu diskutieren wie man das schoener machen kann, ein sehr bekannter mensch sagte mal, der code muss lesbar und funktionell sein und es macht wenig sinn sich mit tricks aufzuhalten was bei opensource immer nur negativ ist... da ihn andere lesen sollen und in unserem fall ein blutiger anfaenger ;) (nix gegen dich ccc)

ciao Exi

Steve
06.02.2004, 20:57
nee,

so war das auch nicht gemeint. Ich dachte das macht es vertändlicher. Nix für ungut. ;)
Steve

ExRevel
06.02.2004, 23:27
Na, is ja ok, immer gut wenn noch wer was sagt, war etwas gereizt vorhin nach dem vormittag! :)

ciao Exi

ccc
30.03.2004, 11:53
kann man mit diesem perl script auch ganze ordner löschen,
egal wie die namen von ordner anfangen ?

wie müsste man den script ändern oder anpassen ?

ExRevel
30.03.2004, 13:46
Jopp, man kann mit dem Modul Net::FTP auch Verzeichnisse löschen! Dazu benutzt man den 'rmdir' Befehl.


# Die 1 ist der Recursewert, ist er true, dann werden alle Dateien und Unterverzeichnisse gelöscht, ist er false dann nur das Verzeichniss, wenn es leer ist.

$ftp->rmdir("Verzeichnis", 1);

Einfach mal 'man Net::FTP' in der Shell eingeben, dann hast alle Infos.

ciao Exi