suche perlscript der files via ftp löschen kann

C

ccc

Routinier
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
 
schau die NET::FTP an. Damit sollte eigentlich schnell was zaubern lassen, vorrausgesetzt man bekomm irgendwie das alter der Datein damit raus.

Steve
 
hi!

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

bis dann
 
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:
Code:
man Net::FTP
oder ueber die perldoc wenn sie bei dir installiert ist oder ueber die Perl Core Documentation.

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
 
danke aber habe noch eine frage:
wie lösche ich alle files, die älter als 7 tage sind ?

gruss
ccc
 
Du wirst wohl oder übel alle arrayelemente durchsuchen müssen. Du kannst ja mittels:
Code:
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
 
das verstehe ich, aber komme mit diesen angaben nicht weiter.

danke und gruss
ccc
 
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...
Code:
#!/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
 
Zuletzt bearbeitet:
herzlichen dank !

es hilft sicher weiter.

gruss und schönen abend
ccc
 
@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.

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

ciao
 
kann ja mal schreiben was ich anders gemacht hätte.

Code:
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:

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

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

würde ich

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


Steve
 
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:
Code:
@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
 
Zuletzt bearbeitet:
nee,

so war das auch nicht gemeint. Ich dachte das macht es vertändlicher. Nix für ungut. ;)
Steve
 
Na, is ja ok, immer gut wenn noch wer was sagt, war etwas gereizt vorhin nach dem vormittag! :)

ciao Exi
 
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 ?
 
Jopp, man kann mit dem Modul Net::FTP auch Verzeichnisse löschen! Dazu benutzt man den 'rmdir' Befehl.
Code:
# 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
 

Ähnliche Themen

solved Problem mit smtp (postfix) als send-only mta hinter NAT

suche lightweight ftp server mit user management

[gelöst] - for file in ... nur für bestimmte Endungen?

Keine Zugriff von Windows 10 auf Sambafreigaben

Samba Datentransfer bricht ab

Zurück
Oben