Thomas: Mit Perl, Dateien unbenennen in einem FTP!?

Hi,

hoffe mal ihr könnt mir helfen ich habe zuerst einmal versuch ein Script zu basteln das mir lokal in einem Verzeichnis einfach die Dateiendung unbenennt. Sowei so gut das hab ich auch geschafft, nur leider geht das ganze nicht wenn ich zu einem FTP connecte und da dann Datein unbenennen will.

Danke schon mal im Voraus!

Hier mein Script:

print "Bitte die FTP Adresse eingeben(ftp.meineftpadresse.de):\n";
$ftp_adresse = <STDIN>;
chomp ($ftp_adresse);

print "Bitte das Verzeichnis eingeben(incoming/ oder keins = / ):\n";
$ftp_verzeichnis = <STDIN>;
chomp ($ftp_verzeichnis);

print "Bitte den Benutzernamen eingeben:\n";
$benutzername = <STDIN>;
chomp ($benutzername);

print "Bitte geben sie das Passwort ein:\n";
$passwort = <STDIN>;
chomp ($passwort);

print "FTP Adresse: $ftp_adresse\n";
print "FTP Verzeichnis: $ftp_verzeichnis\n";
print "Benutzername: $benutzername\n";
print "Passwort: $passwort\n";
print "trying to Connect...\n";
use Net::FTP;

$ftp = Net::FTP->new("$ftp_adresse", Debug => 0, Port => 21, Passive => 0, Timeout =>120) or die "Kann zu der angegebenen Adresse nicht connecten!\n".($!);
    print "login...\n";
    $ftp->login("$benutzername","$passwort") or die "Passwort oder Benutzername falsch\n".($!);   #login ([LOGIN [,PASSWORD [, ACCOUNT] ] ])
    print "changing directory...\n";
    $ftp->cwd("$ftp_verzeichnis");
    print "changing directory succesfull!\n";

#print "Please enter your directory (z.B.: c:/test/test):\n";
 #my $Verzeichnis = <STDIN>;
 #chomp ($Verzeichnis);

print "Bitte gib die Dateiendung ein, die die Files beinhalten,\ndie unbennant werden sollen(ohne Punkt):\n";
 my $now = <STDIN>;
 chomp ($now);

print "Bitte gib die Dateiendung ein, die die Files danach\nbeinhalten sollen(ohne Punkt):\n";
 my $after = <STDIN>;
 chomp ($after);

#chdir ("$Verzeichnis") || "Konnte Verzeichnis nicht wechseln! ($!)";
 # print "Directory changed...\n";

$ftp->dir([DIR, "."]) || die "$Verzeichnis: $!";
 my @Eintraege = readdir(DIR);

my $NeuerEintrag;

foreach $Eintrag (@Eintraege) {

$Eintrag =~ /(.+).$now/;
    $Name = $1;
    $NeuerEintrag = $Name.".$after";
    $ftp->rename($Eintrag,$NeuerEintrag)|| "Konnte die Dateien nicht unbenennen. ($!)";
    print "$Eintrag in $NeuerEintrag umbenannt\n";

}

$ftp->quit;

  1. Hi,
    ich hab zwar keine Ahnung von Perl, aber hätte es nicht ge-
    reicht nur die folgenden Zeilen zu posten?

    $Eintrag =~ /(.+).$now/;
        $Name = $1;
        $NeuerEintrag = $Name.".$after";
        $ftp->rename($Eintrag,$NeuerEintrag)|| "Konnte die Dateien nicht unbenennen. ($!)";
        print "$Eintrag in $NeuerEintrag umbenannt\n";

    Dann hättest du evtl. nur noch erläutern müssen, was welche Va-
    riable beinhaltet.

    Bye,
    Peter
    <!-- Grüße werden gern gesehen. -->

  2. die directory wird nicht richtig eingelesen, sprich in @Eintraege befindet sich garnix !

    ciao
    Micha

    1. die directory wird nicht richtig eingelesen, sprich in @Eintraege befindet sich garnix !

      ciao
      Micha

      mhhh wenn ich die @Eintraege anzeigen lassen zeigt er mir den Inhalt des Verzeichnisses aber an!!!
      Das Script leuft optimal lokal auf dem Rechner mein Problem ist es auf dem FTP zu "arbeiten".

  3. use Mosche;

    hoffe mal ihr könnt mir helfen ich habe zuerst einmal versuch ein Script zu basteln das mir lokal in einem Verzeichnis einfach die Dateiendung unbenennt. Sowei so gut das hab ich auch geschafft, nur leider geht das ganze nicht wenn ich zu einem FTP connecte und da dann Datein unbenennen will.

    my @Eintraege = readdir(DIR);

    my $NeuerEintrag;

    foreach $Eintrag (@Eintraege) {
        $Eintrag =~ /(.+).$now/;

    Wenn ich das richtig verstanden habe, sollen nur die Dateien beachtet werden, die die Endung $now haben. Dann solltest du die Einträge überspringen, die diese Endung nicht haben (weil bei denen oben stehende Regex nicht zutrifft. Also:
     next unless (($Name) = $Eintrag =~ /(.+).$now$/);

    Ich hoffe das stimmt so.

    $NeuerEintrag = $Name.".$after";
        $ftp->rename($Eintrag,$NeuerEintrag)|| "Konnte die Dateien nicht unbenennen. ($!)";

    Sind alle Dateien, die du auf dem FTP-Server hast, auch lokal vorhanden. Sonst vergleichst du zwei unterschiedliche Datenbestände - entweder sind lokal Daten vorhanden, die nicht auf dem FTP - Server sind (was zu einer Fehlermeldung bei FTP-Rename führen wird) oder auf dem FTP-Server sind Dateien, die du lokal nicht hast (was dazu führen würde, das die Dateien auf dem Server nicht umbenannt werden). Vielleicht wäre es einfacher, den Array mit $ftp->dir zu füllen, was diesen Effekt verhindern würde.

    Wenn das nicht funktioniert, solltest du den Fehler noch einmal ausführlicher erläutern.

    use Tschoe qw(Matti);

  4. Hi

    my @Eintraege = $ftp->ls;               # -> 1.
     foreach $Eintrag (@Eintraege) {
        if ($Eintrag =~ /(.+).$now/) {     # -> 2.
        $Name = $1;
        $NeuerEintrag = $Name.".$after";
        $ftp->rename($Eintrag,$NeuerEintrag) || warn "Konnte die Dateien nicht unbenennen. ($!)";
        print "$Eintrag in $NeuerEintrag umbenannt\n";
        }
     }

    zu 1.
    ls ist ein Unix-Befehl für dir, hier wird @Eintraege gefüllt

    zu 2.
    du solltest (mit der if-Bedingung) wirklich nur die Dateien umbenennen, die die Endung $now hat.

    Ciao Micha

    1. use Mosche;

      my @Eintraege = $ftp->ls;               # -> 1.
          if ($Eintrag =~ /(.+).$now/) {     # -> 2.

      zu 1.
      ls ist ein Unix-Befehl für dir, hier wird @Eintraege gefüllt

      zu 2.
      du solltest (mit der if-Bedingung) wirklich nur die Dateien umbenennen, die die Endung $now hat.

      Und welchen Grund gab es, das ganze über zwei Stunden nach mir nochmal zu posten, obwohl du das selbe sagst? Lies bitte die </faq/>, dort steht, dass man zuerst den gesamten Thread lesen sollte, bevor man selber postet.

      use Tschoe qw(Mat*leichtgenervt*ti);

      1. use Tschoe qw(Mat*leichtgenervt*ti);

        mit
        $ftp->dir
        bekommst du unter Umständen eine Ausgabe der Dateirechte etc dazu (also ls -l) und dann kannst du nix umbenennen...

        musst ja schon recht runter mit deinen Nerven sein, wenn dich das aufregt

        dann use mal deinen Tip und escape dich daraufhin

        micha