perl script, das Dateien aus einer Liste löscht

A

ACID25

Grünschnabel
Hallo

ich habe hier ein perl script, dass aus einer vorher generierten Liste, die so aus sieht

31edb809ff19486daf60e66cc3ab1a7d
6cc31f7dda514266b04dcace352100d6
a658e00effac40e094793e9aae378c60

die entsprechenden Dateien löschen soll. Aber irgendwie geht das nicht wirklich.

Code:
#!/usr/bin/perl -w
require 5.004;

my $fname1 = shift;
my $server = shift;             #db-server.intern
my $database = shift;         #VDB1
my $sonaps = shift;            #ServerA ServerB

my $outfname1 = "../CMS_VOS_cleanup_".$sony.".sh";
my $outfname2 = "../CMS_VOS_cleanup_proxies_".$sony.".sh";
my $text = '';

# open file
open(FILE, $fname1) || die("Could not open $fname\n");
@lines_file = <FILE>;
close(FILE);

foreach $line (@lines_file) {
        $line =~ s/,.*//g;
        $line =~ s/\n//g;
        if (length($line)>0) {
                $text .= "wget \"http:\/\/".$server."\/tamino\/".$database."\/cms?_delete=/CompleteDocument[\@ino:id=\"".$line."\"]\" -O /dev/null\n"
        }
}

# write result set file
open(FILE, ">$outfname1") || die("Could not open $fname\n");
print FILE $text;
close(FILE);


# open file
open(FILE, $fname1) || die("Could not open $fname\n");
@lines_file = <FILE>;
close(FILE);

$text = '';
foreach $line (@lines_file) {
        $line =~ s/.*,//g;
        $line =~ s/\n//g;
        if (length($line)>0) {
                $text .= "rm /Video/Proxies/*/".$line."*\n";
        }
}

# write result set file
open(FILE, ">$outfname2") || die("Could not open $fname\n");
print FILE $text;
close(FILE);

Ich vermute das Problem an der Stelle "$text .= "rm /Video/Proxies/*/".$line."*\n";"
Da ich von perl null Ahnung habe, frage ich mich gerade wie rm das so finden soll, müßte da nicht zB ein "find exec rm" Zeiler hin, denn die oben genannten Dateien befinden sich
auch noch mal in Unterordnern? Wäre dankbar für einen tip

LG ACID25
 
Kannst du mal ein paar Testdaten liefern, sonst kann man da keinen Rat geben.
 
Die Befehle werden ja lediglich in ein Shell-Skript geschrieben, das danach noch ausgeführt werden muss. Daher wird da auch nichts gelöscht.
 
Wenn das mit der foreach schleife das Einlesen in die Liste sein soll, dann kann ich dir sagen, dass es so wenig Sinn macht. Eine Datei, die man mit den Cursor-Verfahren einliest wird Zeile für Zeile gelesen (innerhalb einer Schleife). Jedoch schließt du den Dateistream schon, bevor du mit dem Einlesen beginnst.

Außerdem kommt nicht klar raus, was du machen willst. Und von einem Perl-Funktionsaufruf, der etwas löscht, lese ich in dem Skript auch nichts. Wie das geht siehe hier: http://www.tutorialspoint.com/perl/perl_files.htm
Ansonsten einfach mal im Galileo openBook zu Perl nachlesen, wie die Dateiverarbeitung mit Perl geht.

Generell gilt immer für alle Programmiersprachen das folgende Schema (Pseudocode):
Code:
Datei im lesenden Modus öffnen
Zeile in variable lesen

solange Zeile != null
 etwas tun mit der Zeile
 erneut in Variable Zeile einlesen
Dateicursor schließen
Hoffe, das konnte helfen.
 
Wenn das mit der foreach schleife das Einlesen in die Liste sein soll, dann kann ich dir sagen, dass es so wenig Sinn macht. Eine Datei, die man mit den Cursor-Verfahren einliest wird Zeile für Zeile gelesen (innerhalb einer Schleife). Jedoch schließt du den Dateistream schon, bevor du mit dem Einlesen beginnst.
Nein, das stimmt so nicht. Er öffnet die Datei, packt ihrer Inhalt in @lines_file (der Raumschiff-Operator sorgt bei Perl dafür, dass jede Zeile zu einem Array-Element wird) und schliesst daraufhin die Datei. Er kann also problemlos danach auf dem Array weiter arbeiten, und dort noch auf den zwischengespeicherten Inhalt der Datei zugreifen, was er ja auch tut.

Und von einem Perl-Funktionsaufruf, der etwas löscht, lese ich in dem Skript auch nichts.
Ja, einen rm-Befehl gibt's in dem Perl-Skript nicht. Es generiert lediglich eine Text-Datei/ein Shell-Skript, das die rm-Befehle enthält.
Code:
$text .= "rm /Video/Proxies/*/".$line."*\n";
...
print FILE $text;


Ansonsten einfach mal im Galileo openBook zu Perl nachlesen, wie die Dateiverarbeitung mit Perl geht.
... no comment ;)
 
Nein, das stimmt so nicht. Er öffnet die Datei, packt ihrer Inhalt in @lines_file (der Raumschiff-Operator sorgt bei Perl dafür, dass jede Zeile zu einem Array-Element wird) und schliesst daraufhin die Datei. Er kann also problemlos danach auf dem Array weiter arbeiten, und dort noch auf den zwischengespeicherten Inhalt der Datei zugreifen, was er ja auch tut.


Ja, einen rm-Befehl gibt's in dem Perl-Skript nicht. Es generiert lediglich eine Text-Datei/ein Shell-Skript, das die rm-Befehle enthält.
Code:
$text .= "rm /Video/Proxies/*/".$line."*\n";
...
print FILE $text;



... no comment ;)

Ok, ja sorry, ich bin mit Perl nicht so familiär. Hatte das nur mal kurz benutzt. Naja, bei so einer Frage, die man eig durch googeln sich selbst beantworten könnte, kann ich nicht anders, als solche Links zu teilen. xD
 

Ähnliche Themen

Zugriff Ubuntu 16.04. auf Freigabe 18.04. LTS nicht möglich

[Perl] Perl OO Methodenaufruf in anderem Objekt

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

Akonadi startet nicht mehr

Windows clients können nicht mehr auf lange laufendes System zugreifen

Zurück
Oben