#!/usr/bin/perl -w use strict; use warnings; use File::Copy; # im unten eingeklammerten Bereich können die Variablen geändert werden ACHTUNG: Auch unter Windows / statt \ verwenden ########################################################################## # wo befinden sich XML und PDF-Dateien? my $suchpfad = "D:/aa a/_bbb/_ccc"; # wie heißt die XML-Datei? my $xmldatei = "ready.xml"; #Wie heißt der Delimiter (eingrenzender Tag) in der XML-Datei? my $delimiter = ""; #wohin sollen die Ordner kopiert werden? my $ziel = "H:/Perl/Skripts/aa a/Zielordner"; ######################################################################### my $xmltreffer = "0"; my $fstreffer = "0"; my $timecounter = "0"; my @delarray; my @lesen; push @lesen,"$suchpfad"; while (scalar @lesen) { my $verz = shift @lesen; opendir (VERZEICHNIS,$verz) or die "$!"; foreach my $file (sort {$a cmp $b} readdir VERZEICHNIS) { if (-d "$verz/$file") { push @lesen,"$verz/$file" if $file ne '.' && $file ne '..'; } elsif ($file =~ /^$xmldatei$/) { # Durch Regex Treffer ermitteln print "XML-Datei: $file im Verzeichnis $verz\n"; print '$verz: ' . "$verz\n"; print '$file: ' . "$file\n"; open(XMLFILE, "<$verz/$file") || die "XML-Datei: $!"; while () { #wenn Tag " gefunden wird if ($_ =~ "") { $xmltreffer++; #entferne den / des schließenden Tags $_ =~ s/\///; #splitte nach --> [][filename] [] my @split = split(//, $_); #loope, solange es die Datei, die jetzt im XML-Dokument gefunden wurde nicht auch im FS gibt mit einem timeout von x Sekunden. while (!(-e "$verz/$split[1]") && ($timecounter<=300)) { print "$verz/$split[1] nicht gefunden.\n"; sleep(1); $timecounter ++; } # falls die Datei mittlerweile existiert if (-e "$verz/$split[1]") { $fstreffer++; } $timecounter = "0"; } } close (XMLFILE); if (($xmltreffer eq $fstreffer) && ($xmltreffer ne 0)) { #copy($File::Find::dir , $ziel); print "kopiere $verz/*\n"; #splitte das aktuelle Verzeichnis, in $array[-1] (am Ende) befindet sich dann z.B. S455_00015653 my @array = split(/\//, $verz); #print "$array[-1]\n"; opendir(IN,"$verz") || die $!; my @dirarray=readdir(IN); close IN; foreach(@dirarray) { if ($_ ne "." && $_ ne "..") { print "$_\n"; mkdir("$ziel/$array[-1]") unless (-e "$ziel/$array[-1]"); move("$verz/$_", "$ziel/$array[-1]") or die "File move: $!"; } } push(@delarray, "$verz"); } } } closedir VERZEICHNIS; } foreach(@delarray) { rmdir $_ || die "remove dir: $!"; }