Frage

Wie kopiere ich ein Verzeichnis mit Unterverzeichnissen Ausschließen von Dateien oder Verzeichnissen, die eine bestimmte Regex auf einem Windows-System überein?

War es hilfreich?

Lösung

ich so etwas tun würde:

use File::Copy;
sub copy_recursively {
    my ($from_dir, $to_dir, $regex) = @_;
    opendir my($dh), $from_dir or die "Could not open dir '$from_dir': $!";
    for my $entry (readdir $dh) {
        next if $entry =~ /$regex/;
        my $source = "$from_dir/$entry";
        my $destination = "$to_dir/$entry";
        if (-d $source) {
            mkdir $destination or die "mkdir '$destination' failed: $!" if not -e $destination;
            copy_recursively($source, $destination, $regex);
        } else {
            copy($source, $destination) or die "copy failed: $!";
        }
    }
    closedir $dh;
    return;
}

Andere Tipps

Eine weitere Option ist File :: Xcopy. Wie der Name schon sagt, ist es mehr oder weniger emuliert den Windows-Befehl xcopy, einschließlich der Filterung und rekursive Optionen.

Aus der Dokumentation:

    use File::Xcopy;

    my $fx = new File::Xcopy; 
    $fx->from_dir("/from/dir");
    $fx->to_dir("/to/dir");
    $fx->fn_pat('(\.pl|\.txt)$');  # files with pl & txt extensions
    $fx->param('s',1);             # search recursively to sub dirs
    $fx->param('verbose',1);       # search recursively to sub dirs
    $fx->param('log_file','/my/log/file.log');
    my ($sr, $rr) = $fx->get_stat; 
    $fx->xcopy;                    # or
    $fx->execute('copy'); 

    # the same with short name
    $fx->xcp("from_dir", "to_dir", "file_name_pattern");

Wenn Sie auf einem Unix-artigen Betriebssystem sein passieren und den Zugang zu rsync (1) haben, sollten Sie diese verwenden (zum Beispiel durch system()).

Perl File :: Copy ist ein bisschen gebrochen (es kopiert keine Berechtigungen auf Unix-Systemen, zum Beispiel), so dass, wenn Sie nicht Ihre System-Tools verwenden möchten, schauen Sie sich CPAN. Vielleicht File :: Copy :: rekursive von Nutzen sein könnte, aber ich sehe keine Optionen ausschließen. Ich hoffe, jemand anderes hat eine bessere Idee.

Ich weiß nicht, wie man mit einer Kopie einen Ausschluß zu tun, aber man kann etwas nach oben entlang der Linien arbeiten:

ls -R1 | grep -v <regex to exclude> | awk '{printf("cp %s /destination/path",$1)}' | /bin/sh

Eine klassische Antwort würde verwenden 'cpio -p':

(cd $SOURCE_DIR; find . -type f -print) |
perl -ne 'print unless m/<regex-goes-here>/' |
cpio -pd $TARGET_DIR

Der Befehl deal ‚cpio‘ mit dem eigentlichen Kopieren, einschließlich Genehmigung Erhaltung. Der Trick von ‚cd $SOURCE_DIR; find . ...‘ beschäftigt sich mit dem vorderen Teil des Quellpfad von den Namen zu entfernen. Das einzige Problem mit dem Aufruf von ‚find‘ ist, dass es nicht Symlinks folgen; Sie brauchen ‚-follow‘ hinzufügen, wenn das ist, was Sie wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top