#!/usr/bin/perl use strict; # strict verwenden use warnings; # ebenso Warnungen einschalten use File::Spec; # Modul zum Zusammensetzen von Dateipfaden use File::Copy; # Modul zum Kopieren/Verschieben von Dateien use File::Path; # Modul zum rekursiven Erstellen von Verzeichnissen # Hilfe/Details zu den Modulen: ($modulename entsprechend ersetzen) # http://search.cpan.org/perldoc?$modulname my $file='sector_file.txt'; # globaler Hash mit Pfadinformationen my %path = ( sectioninfo => '/tmp/section_info.x', # kompletter Pfad zur Datei "Sektionsinfo.x" dst_dir => '/tmp/sections', # Verzeichnispfad, wohin die Dateien kopiert werden src_dir => '/tmp/source_sections', # Verzeichnispfad, von wo die Dateien kopiert werden section => 'Sek_1', # Angabe der Sektion die kopiert werden soll, # wenn er Eintrag leer undef oder nicht vorhanden ist, # so werden alle gefundenen Sektionen Kopiert ); # lese Die Sektioninfos ein my $sections = parse_file( $path{sectioninfo}, $path{section} ); # jede Sektion einzeln betrachten for my $section_name ( keys{%$sections} ) { # Prüfen ob die Sektion kopiert werden soll next if($path{section} && $section_name ne $path{section}); # Zielpfad ermitteln my $destination = File::Spec->catdir( $path{dst_dir}, $section_name ); # lege Verzeichnis $destination an, wenn noch nicht vorhanden if ( ! -e $destination ) { mkpath $destination or die "mkdir $destination failed: $!\n"; } # sterbe mit Fehler, wenn $destination existiert und kein Verzeichnis ist elsif ( !-d $destination ) { die "$destination is not a directory: $!\n"; } # Dateien Kopieren copy_files_from_to( $sections->{$section_name}, $path{src_dir}, $destination ); } ######################################################################## sub parse_file { my $file=shift; # wenn kein Sektorname angeben gib alle Sektoren zurück. my $sector=shift; # wenn $sector nur eine Zahl ist, den Vollständigen Namen ergänzen $sector="Sek_$sector" if(defined($sector) && $sector=~/^\d+$/); open(my $fh, '<', $file) or die("Error open $file ($!)\n"); my $ret={}; my $sector_now; my $last_line=''; while(my $line=<$fh>) { chomp($line); # Sektordefinitionen beginnen immer mit einem "Sek_" gefolgt von einer Zahl if($line=~/(Sek_\d+)/) { # Ausnahmeregelung wenn nur ein Sektor gesucht ist if($sector) { if($1 eq $sector) { $sector_now=$1 } # abbrechen wenn der Sektor vollständig gelesen wurde elsif($sector_now && $sector_now eq $sector) { last } } else { $sector_now=$1; } # $line leeren, # sonst wird später die erste Datei nicht gefunden. $line=''; } # ein Sektor wurde gefunden # nun hole alle Dateinamen. # Sie stehen immer hinter einer leeren Zeile elsif($sector_now && $line!~/^\s*$/ && $last_line=~/^\s*$/) { my $fname=$line; chomp($fname); push(@{$ret->{$sector_now}},$fname); } # letzte zeile speichern, # um später zu testen, ob sie leer ist $last_line=$line; } close($fh); return $ret; } _END_