Schrift
[thread]8810[/thread]

wie kann ich komplette Verzeichnisse kopieren?



<< >> 10 Einträge, 1 Seite
Gast Gast
 2007-03-05 15:38
#74775 #74775
Hallo,

nach langem erfolglosen Suchen im Internet, hoffe ich das mir hier mit meinen Problem geholfen werden kann.

Ich will ein Backup eines kompletten Verzeichnisbaum erstellen, hierbei sollen sowohl Verzeichnisse, Unterverzeichnisse und alle Dateien kopiert werden.

meine bisheriger Ansatz war File::copy,
aber damit funktioniert es nicht,
ich habe auch ein cpan-modul gefunden mit den namen file::copy::recursive
leider ist dies nicht standardmodul von perl, und wäre nur meine letzte Wahl wenn sich wirklich nichts anderes findet

ich will keinen fertigen Quellcode, nur eine Idee wie es funktionieren könnte, kann mir da jm. helfen?!

vielen Dank
vayu
 2007-03-05 15:48
#74776 #74776
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
welches BS?

kannst doch je nachdem einfach nen systemcall absetzen, der dir die verzeichnisse kopiert

Linux:
Code: (dl )
system("cp -r $dir $newdir");
topeg
 2007-03-05 18:37
#74777 #74777
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Um es kurz zu umschreiben. :-)
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
#!/usr/bin/perl
use strict;
use warnings;
use File::Copy;

my $quelle='/pfad/zur/quelle';
my $ziel='/pfad/zum/ziel';

my @dirliste=('.');
while(@dirliste >0)
{
  my $dir=shift(@dirliste);
  opendir(DIR,"$quelle/$dir") or die "Konnte Verzeichnis $dir nicht öffnen ($!)";
  while(my $d=readdir(DIR))
  {
   my $path="$dir/$d";
   if(-d "$quelle/$path")
   {
    push (@dirliste,$path);
    mkdir("$ziel/$path") unless(-d "$ziel/$path");
   }
   else
   {
    copy("$quelle/$path","$ziel/$path") or die "konnte $path nicht kopieren ($!)";
   }
  }
  closedir(DIR);
}

Ist ungetestet.
Schneller als in perl kann ich es nicht erklähren...
renee
 2007-03-05 19:49
#74778 #74778
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
CPAN:File::NCopy oder CPAN:File::Copy::Recursive
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pktm
 2007-03-06 12:52
#74779 #74779
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
[quote=topeg,05.03.2007, 17:37]Um es kurz zu umschreiben. :-)
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
#!/usr/bin/perl
use strict;
use warnings;
use File::Copy;

my $quelle='/pfad/zur/quelle';
my $ziel='/pfad/zum/ziel';

my @dirliste=('.');
while(@dirliste >0)
{
  my $dir=shift(@dirliste);
  opendir(DIR,"$quelle/$dir") or die "Konnte Verzeichnis $dir nicht öffnen ($!)";
  while(my $d=readdir(DIR))
  {
   my $path="$dir/$d";
   if(-d "$quelle/$path")
   {
    push (@dirliste,$path);
    mkdir("$ziel/$path") unless(-d "$ziel/$path");
   }
   else
   {
    copy("$quelle/$path","$ziel/$path") or die "konnte $path nicht kopieren ($!)";
   }
  }
  closedir(DIR);
}

Ist ungetestet.
Schneller als in perl kann ich es nicht erklähren...[/quote]
Was macht der Punkt in @dirliste?
Code: (dl )
my @dirliste=('.');


Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
PerlProfi
 2007-03-06 18:03
#74780 #74780
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
[quote=pktm,06.03.2007, 11:52]Was macht der Punkt in @dirliste?
Code: (dl )
my @dirliste=('.');


Grüße, pktm[/quote]
Damit das aktuelle Verzeichnis geöffnet wird muss am Anfang mal der . in der Liste drin stehen.

MfG
topeg
 2007-03-06 21:43
#74781 #74781
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
[quote=pktm,06.03.2007, 11:52]Was macht der Punkt in @dirliste?
Code: (dl )
my @dirliste=('.');
[/quote]
1. Damit ich die Dateien kopieren kann brauche ich den Dateipfad relativ zum Quelleverzeichnis.
2. Das Script läuft ja solange wie "@dirliste" nicht leer ist, allso muß zu Anfang etwas da drin stehen.
3. Ich muß das Quellverzeichnis selber öffnen. Das mache ich am besten, in dem ich mit "quellverzeichnis/." auf sich selber Verweise.
Dubu
 2007-03-10 15:54
#74782 #74782
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=vayu,05.03.2007, 14:48]Linux:
Code: (dl )
system("cp -r $dir $newdir");
[/quote]
Für Backups empfehle ich dringend, den Parameter "-a" statt einfach "-r" zu benutzen:
Code: (dl )
cp -a src target

Damit werden auch Permissions und Symlinks erhalten und bei Spezialdateien (Pipes, FIFOs, Devices) kein Unsinn angestellt.
Besser geeignet als cp sind evtl. andere Programme wie tar, rsync oder cpio oder afio. Welche davon auch für Windows geeignet/verfügbar sind und auch ACLs u.ä. unterstützen, kann ich nicht sagen.

Beim system-Aufruf sollten übrigens Quelle und Ziel gequotet werden, oder noch besser: die Mehrparameterform von system() benutzt, damit es keine Probleme mit Leer- oder Sonderzeichen im Namen gibt:
Code: (dl )
system ('cp', '-a', $dir, $newdir);
betterworld
 2007-03-11 04:36
#74783 #74783
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Und dann gibt es ja immer noch diese schlimmen Dateinamen, die mit "-" anfangen. Also:
Code: (dl )
system('cp', '-a', '--', $dir, $newdir);

(Anmerkung: "-a" und "--" gibt es beide nur beim cp von den GNU coreutils bzw. GNU getopt, soweit ich weiss.)
ptk
 2007-03-11 18:10
#74784 #74784
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Alternativ könnte man rsync -a verwenden. Das ist portabler als cp (das cp bei *BSD kennt z.B. kein -a).
<< >> 10 Einträge, 1 Seite



View all threads created 2007-03-05 15:38.