Thread Daten aus einer Datei lesen und in ein Verzeichnis/ Datei speichern (11 answers)
Opened by Sanny at 2010-09-26 22:18

Linuxer
 2010-09-26 23:22
#141527 #141527
User since
2006-01-27
3872 Artikel
HausmeisterIn

user image
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!

View full thread Daten aus einer Datei lesen und in ein Verzeichnis/ Datei speichern