Perl-Script Foto-CD kopieren

aus LugUM, der freien Wissensdatenbank

Skript zum Kopieren von digitalisierten Bildern z. B. von einer Foto-CD in einen Pfad auf den Rechner und dabei Umbennen nach Regex

Autor: Stefan Feser

#!/usr/bin/perl

# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# +                                                                +
# +           Perlskript zum Veraendern des Bildnamens             +
# +          welcher auf einer FotoCD angegeben ist, hin           +
# +           zu einem Dateinamen im abgefragten Schema            +
# +                                                                +
# +   Autor         :  Stefan Feeser, Karlstein, OpenSource        +
# +   Datum         :  14.08.2005                                  +
# +   Version       :  0.1                                         +
# +   Aenderungen   :  14.08.2005    Ersterstellung                +
# +                                                                +
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

use strict;

#
# ------------------ Deklarationsteil -------------------
#

my $str_in = "";                                     # Einlesevariable
my $str_out = "";
my $str_janein = "";
my $str_zielname = "";
my $str_org = "";
my $str_kopnam = "";
my $str_quelle = "";
my $str_ziel = "";
my $str_regex_1 = "";
my $str_regex_2 = "";
my $str_pfad_in = "/daten/multimedia/grafik/in/";    # Standart: /media/cdrom/
my $str_pfad_out = "/daten/multimedia/grafik/out/";
my $str_pfad_thp = "/daten/multimedia/grafik/thump/";
my $str_fehler = "";
my $int_fehler = 0;
my $int_i = 0;                                       # Zaehler fuer Schleifen
my $int_erg = 0;
my $str_lsdat = "";                                  # Hilfsvariable
my $str_firstdat = "";
my $str_lastdat = "";

#
# -------------------- Hauptprogramm --------------------
#

# Verzeichnisse erfragen

system "clear";
print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
print "+                                                              +\n";
print "+         Willkommen beim Programm img-chng-name.pl            +\n";
print "+         -- Namenskonvertierung von jpg-Dateien --            +\n";
print "+                                                              +\n";
print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
print "\n";
print "Bitte geben Sie zunaechst den Zielpfad an:\n";
print "(Vorgabe ist " . $str_pfad_out . " ):\n";
chomp ($str_out =<STDIN>);
if ($str_out ne "") {
    $str_pfad_out = $str_out;
}
print "Bitte geben Sie den Pfad an von dem die jpg-Dateien eingelesen\n";
print "werden sollen (Vorgabe ist " . $str_pfad_in . " ):\n";
chomp ($str_in =<STDIN>);
if ($str_in ne "") {
    $str_pfad_in = $str_in;
}
print "Der Pfad " .  $str_pfad_in . " wird nun durchsucht!\n";

# Pruefen ob sich eine CD mit den gewuenschten Bildern im Laufwerk befindet

opendir VERZ, $str_pfad_in or die "Kann $str_pfad_in nicht oeffnen: $!\n";
while ($str_lsdat = readdir VERZ) {
    next if $str_lsdat eq "." or $str_lsdat eq ".."; # Punkt und Punkt Punkt ueberspringen
    if ($str_lsdat =~ /\.[jJ][pP][gG]$/) {           # Pruefen nach jpgs
        $int_i += 1;
        if ($int_i eq 1) {
            $str_firstdat = $str_lsdat;
        }
        $str_lastdat = $str_lsdat;
    } else {
        next;
    }
    $int_erg = $int_i;
}
closedir VERZ;
if ($int_i >= 1) {
    system "clear";
    print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
    print "+                                                              +\n";
    print "+           Analysen des Programms img-chng-name.pl            +\n";
    print "+                                                              +\n";
    print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
    print "\n";
    print "1. Pruefen der im Deklarationsteil angegebenen Verzeichnisse\n";
    print "\n";
    print "Im Verzeichnis " . $str_pfad_in . " wurden insgesamt\n" . $int_erg ." jpg-Datei(en) gefunden. ";
    print "Die erste gefundene Datei war:\n";
    print "\n";
    print "              >> " . $str_firstdat . " <<             \n";
    print "\n";
    print "Die letzte gefundene Datei war:\n";
    print "\n";
    print "              >> " . $str_lastdat . " <<             \n";
    print "\n";
    print "H I N W E I S: Sollten die gefundenen Dateien in ihrem Muster\n";
    print "nicht uebereinstimmen, sollten Sie die Dateilliste im angegebenen\n";
    print "Pfad ggf. veraendern!\n";
    print "\n";
    print "2. Suchmusterpruefung und Namensvergabe\n";
    print "\n";
    print "Bitte geben Sie nun den Bildnamen und das Datum ein\n";
    print "(Beispiel: 200409_kreuzlingen)\n";
    chomp ($str_zielname = <STDIN>);
    if ($str_zielname eq "") {
        $str_fehler = "Sie haben keinen Namen angegeben";
        $int_fehler = 1;
        &fehler ($str_fehler,$int_fehler);
        exit;
    }
    print "Ist der Bildname " . $str_zielname . " so in Ordnung?\n";
    chomp ($str_janein = <STDIN>);
    if ($str_janein =~ /[Jj][Aa]/) {
        print "\n";

# RegEx abfragen und Funktionsweise pruefen (Ergebnisausgabe)

        print "Bitte geben Sie nur ein Suchmuster (RegEx) fuer die Konver-\ntierung an.\n";
        print "Zunaechst das Muster vor der Indexzahl:\n";
        chomp ($str_regex_1 = <STDIN>);
        print "Und nun das Muster danach:\n";
        chomp ($str_regex_2 = <STDIN>);
        print "Der regulaere Ausdruck wuerde folgende Konvertierung\n";
        print "der ersten gefundenen Datei " . $str_firstdat . " vornehmen:\n\n";
        $str_firstdat =~ s/$str_regex_1//;
        $str_firstdat =~ s/$str_regex_2//;
        print $str_zielname . "_" . $str_firstdat . "\n\n";
        print "Die letzte gefundene Datei " .$str_lastdat . " wuerde so konvertiert:\n\n";
        $str_lastdat =~ s/$str_regex_1//;
        $str_lastdat =~ s/$str_regex_2//;
        print $str_zielname . "_" . $str_lastdat . "\n";
        print "\n";
        print "Sind Sie mit dem Ergebnis zufrieden?\n";
        chomp ($str_janein = <STDIN>);
        if ($str_janein =~ /[Jj][Aa]/) {
            system "clear";
            print  "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
            print "+  +\n";
            print "+      Konvertierung des Dateinamens und Kopiervorgang  +\n";
            print "+  +\n";
            print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
            print "\n";
            print "Die Dateien werden nun umbenannt und ins angebene Verzeichnis\n";
            print "kopiert.\n\n";

# Eigentliche Dateinamenaenderung durchfuehren

            opendir VERZ, $str_pfad_in or die "Kann $str_pfad_in nicht oeffnen:$!\n";
            while ($str_lsdat = readdir VERZ) {
                next if $str_lsdat eq "." or $str_lsdat eq "..";
                if ($str_lsdat =~ /\.[jJ][pP][gG]$/) {
                    $str_quelle = $str_lsdat;
                    $str_lsdat =~ s/$str_regex_1//;
                    $str_lsdat =~ s/$str_regex_2//;
                    $str_kopnam = $str_zielname . "_" . $str_lsdat;
                    $str_ziel = $str_pfad_out . $str_kopnam;
                    $str_quelle = $str_pfad_in . $str_quelle;
                    print "Quelle: " . $str_quelle . "\n";
                    print "Ziel: " . $str_ziel . "\n";
                    system "cp $str_quelle $str_ziel";
                    print "ok\n";
                }
            }
            closedir VERZ;
            print "\n------\n";
            print "\n";
            print "E N D E: Das Kopieren und Umbenennen ist erfolgt!\n";
        } else {
            $str_fehler = "Der regulaere Ausdruck war nicht ok!";
            $int_fehler = 4;
            &fehler ($str_fehler,$int_fehler);
            exit;
        }
    } else {
        $str_fehler = "Der Name war falsch";
        $int_fehler = 2;
        &fehler ($str_fehler,$int_fehler);
        exit;
    }
} else {
    $str_fehler = "Das Einleseverzeichnis war leer! Bitte pruefen Sie ob\nggf. das Medium noch gemountet werden muss.\n";
    $int_fehler = 3;
    &fehler ($str_fehler,$int_fehler);
    exit;
}

#
# --------------------- Subroutinen ---------------------
#

# Ausgabe fuer im Programm vorkommende Fehler

sub fehler {
    $str_fehler = $_[0];
    system "clear";
    print "Das Programm wurde wegen einem Fehler beendet!\n";
    print "----------------------------------------------\n";
    print "\n";
    print $int_fehler . ": " . $str_fehler . "\n";
    print "\n";
}
'Persönliche Werkzeuge