#! /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 # globaler Hash mit Pfadinformationen my %path = ( sectioninfo => '/tmp/section_info.x', dst_dir => '/tmp/sections', src_dir => '/tmp/source_sections', ); # sub routinen # ---------------------------------------------------------- sub read_blocks_from_file { my ( $filename, $separator ) = @_; open my $fh, '<', $filename or die "open(ro) failed: $filename: $!\n"; local $/ = $separator; chomp( my @blocks = <$fh> ); close $fh; return @blocks; } sub parse_block { my ( $block ) = @_; # trenne Block in Zeilen auf; erste Zeile: Sektion; restliche Zeilen: Dateien my ( $section, @files ) = split m{$/}, $block; return $section, @files; } sub copy_files_from_to { # aRef: Array-Referenz auf Array mit Dateinamen my ( $aRef, $srcdir, $dstdir ) = @_; for my $file ( @$aRef ) { my $srcfile = File::Spec->catfile( $srcdir, $file ); copy( $srcfile, $dstdir ) or die "copy $srcfile to $dstdir failed: $!\n"; } } # main skript # ---------------------------------------------------------- # lese blockweise ein; jeder Block wird von zwei Umbruechen abgeschlossen my @blocks = read_blocks_from_file( $path{sectioninfo}, $/x2 ); # jeden Block einzeln betrachten for my $block ( @blocks ) { my ( $section, @files ) = parse_block( $block ); my $destination = File::Spec->catdir( $path{dst_dir}, $section ); # 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"; } copy_files_from_to( \@files, $path{src_dir}, $destination ); } __END__