4 Stimmen

Wie kann ich ein Verzeichnis mit Ausnahme aller versteckten Dateien in Perl kopieren?

Ich habe eine Verzeichnishierarchie mit einer Reihe von Dateien. Einige der Verzeichnisse beginnen mit einem . . Ich möchte die Hierarchie an einen anderen Ort kopieren und dabei alle Dateien und Verzeichnisse auslassen, die mit einem .

Wie kann man das tun?

4voto

Evan Carroll Punkte 1

Ich denke, was Sie wollen, ist Datei::Kopieren::Rekursiv 's rcopy_glob() :

rcopy_glob()

Mit dieser Funktion können Sie eine Muster angeben, das für Perls glob() als als erstes Argument angeben. Anschließend wird jeder Pfad, der von perl's glob() zurückgegeben wird, mit rcopy()ied.

Sie gibt ein Array zurück, dessen Elemente sind Array refs sind, die den Rückgabewert Wert jedes rcopy()-Aufrufs enthält.

Es erzwingt ein Verhalten, als ob $File::Copy::Recursive::CPRFComp ist wahr ist.

0 Stimmen

Ich konnte nicht herausfinden, wie man rcopy_glob dazu verwendet, und habe auch kein Beispiel im Internet gefunden. Wie würden Sie rcopy_glob tatsächlich verwenden, um dies zu erreichen?

4voto

FMc Punkte 40706

Wenn Sie in der Lage sind, dieses Problem ohne Perl zu lösen, sollten Sie sich rsync . Es ist auf Unix-ähnlichen Systemen, unter Windows über cygwin und möglicherweise als eigenständiges Tool unter Windows verfügbar. Es kann alles, was Sie brauchen, und noch viel mehr.

rsync -a -v --exclude='.*' foo/ bar/

Wenn Sie nicht der Eigentümer aller Dateien sind, verwenden Sie -rOlt 代わりに -a .

0voto

Anonymous Punkte 45953

Glob ignoriert standardmäßig Dot-Dateien.

perl -lwe'rename($_, "foo/$_") or warn "failure renaming $_: $!" for glob("*")'

0 Stimmen

Das ist kein Kopieren, sondern ein Verschieben, und es ist nicht rekursiv.

0 Stimmen

Glob ignoriert keine versteckten Dateien, sondern gibt nur die Dateien zurück, nach denen Sie gefragt haben. Es ist das '*'-Muster, das nicht mit einem führenden übereinstimmt. Ein kleiner Fehler, aber wichtig, um zu wissen, wer was ignoriert :)

0 Stimmen

Die Funktion ignoriert Verzeichniseinträge. readdir und es ist da, benutze einen Shell-style glob mit bsd_glob und es ist nicht da, benutze einen text oder dos glob und es ist da.

0voto

Greg Bacon Punkte 127209

Der nachstehende Code erledigt die Aufgabe auf einfache Weise, kann aber z. B. keine Symlinks verarbeiten.

#! /usr/bin/perl

use warnings;
use strict;

use File::Basename;
use File::Copy;
use File::Find;
use File::Spec::Functions qw/ abs2rel catfile file_name_is_absolute rel2abs /;

die "Usage: $0 src dst\n" unless @ARGV == 2;
my($src,$dst) = @ARGV;

$dst = rel2abs $dst unless file_name_is_absolute $dst;
$dst = catfile $dst, basename $src if -d $dst;

sub copy_nodots {
  if (/^\.\z|^[^.]/) {
    my $image = catfile $dst, abs2rel($File::Find::name, $src);

    if (-d $_) {
      mkdir $image
        or die "$0: mkdir $image: $!";
    }
    else {
      copy $_ => $image
        or die "$0: copy $File::Find::name => $image: $!\n";
    }
  }
}

find \&copy_nodots => $src;

0voto

ObiWahn Punkte 111
cp -r .??*

fast perfekt, da Dateien, die mit . beginnen und von einem einzelnen Zeichen gefolgt werden, nicht berücksichtigt werden. wie - .d oder .e

echo .[!.] .??*

das ist noch besser

oder:

shopt -s dotglob ; cp -a * destination; shopt -u dotglob

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X