Thread Daten aus einer Datei lesen und in ein Verzeichnis/ Datei speichern
(11 answers)
Opened by Sanny at 2010-09-26 22:18
Hi,
hier mal ein (nur grob getesteter) Vorschlag, so wie ich Deine Ausführungen verstanden habe. Das Skript geht davon aus, dass die zu kopierenden Dateien alle in einem Ordner liegen und dort rauskopiert werden. Die zu kopierenden Dateien sind nur mit ihrem Namen in der Sektionsinfo.x eingetragen, nicht mit ihren vollen Pfaden. Pfade und Namen der verwendeten Dateien und Verzeichnisse sind anzupassen. Das Skript geht ferner davon aus, dass die verwendeten Zeilenumbrueche zu dem Betriebssystem passen, auf dem das Skript ausgefuehrt wird. Ist dies nicht der Fall, ist das Skript entsprechend anzupassen (beachte $/; perldoc perlvar). Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 #! /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__ meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen! |