Wie kopiere ich ein Verzeichnis einschließlich Unterverzeichnissen mit Ausnahme von Dateien oder Verzeichnissen, die einem bestimmten Regex auf einem Windows-System entsprechen?Wie kann ich ein Verzeichnis rekursiv kopieren und Dateinamen in Perl filtern?
Antwort
ich 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;
}
Ich weiß nicht, wie man mit einer Kopie einen Ausschluß zu tun, aber man kann etwas nach oben entlang der Linien der Arbeit:
ls -R1 | grep -v <regex to exclude> | awk '{printf("cp %s /destination/path",$1)}' | /bin/sh
Wenn Sie auf einem Unix-ähnliches Betriebssystem geschehen zu sein und Zugang hast zu rsync (1)
, sollten Sie das verwenden (zum Beispiel durch system()
).
Perls File :: Copy ist ein bisschen kaputt (es kopiert keine Berechtigungen auf Unix-Systemen zum Beispiel). Wenn Sie also Ihre Systemtools nicht verwenden wollen, schauen Sie sich CPAN an. Vielleicht könnte File::Copy::Recursive von Nutzen sein, aber ich sehe keine Ausschlussoptionen. Ich hoffe, jemand anderes hat eine bessere Idee.
Eine weitere Option ist File :: Xcopy. Wie der Name schon sagt, emuliert er mehr oder weniger den Befehl windows xcopy, einschließlich seiner Filter- und rekursiven 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");
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
Die' cpio
' Befehl befasst sich mit dem eigentlichen Kopieren, einschließlich Genehmigung Erhaltung. Der Trick von 'cd $SOURCE_DIR; find . ...
' behandelt das Entfernen des führenden Teils des Quellweges von den Namen. Das einzige Problem mit diesem Aufruf von 'find
' ist, dass es Symlinks nicht folgen wird; Sie müssen "-follow
" hinzufügen, wenn Sie das möchten. so etwas wie dieses
funktioniert das auch auf Windows? – Manu
- 1. Wie kann ich Verzeichnisse in Perl rekursiv auslesen?
- 2. Wie kann ich den Dateinamen in Perl ändern?
- 3. xcopy Verzeichnisse und Unterverzeichnisse rekursiv und filtern, um nur die Dateinamen durch Erweiterung
- 4. Rekursiv scp außer aktuelles Verzeichnis
- 5. Wie kann ich ein Zip-Archiv in Perl erstellen?
- 6. Perl: rekursiv alle Dateien und Verzeichnisse umbenennen
- 7. Hadoop ein Verzeichnis kopieren?
- 8. Wie kann ich alle Dateinamen in einem Verzeichnis abrufen?
- 9. Wie kann ich das Verzeichnis (Dateipfad) Trennzeichen in Perl?
- 10. Wie kann ich ein Verzeichnis sperren?
- 11. Wie erstelle ich ein Verzeichnis in Perl, die als EPOCH
- 12. löschen Verzeichnis rekursiv in Scala
- 13. Ich rekursiv durch einen Verzeichnisbaum gehen und Dateinamen auflisten
- 14. Wie kann ich Dateinamen in Python dekrementieren?
- 15. Rekursiv kopieren Sie eine Reihe von Dateien von einem Verzeichnis in ein anderes in PowerShell
- 16. prüfen, ob ein Verzeichnis in Linux existiert Perl mit
- 17. Wie kann ich rekursiv in einem Verzeichnis in Vim suchen und ersetzen?
- 18. Wie kann ich ein Verzeichnis in Perl wie tar in UNIX archivieren?
- 19. Kann ich einen Dateinamen von einem Dateihandle in Perl finden?
- 20. Perl: grep ein übergeordnetes Verzeichnis
- 21. Bilddatei in Perl kopieren
- 22. Wie kopiert und fügt man ein ganzes Verzeichnis rekursiv in einen neuen Pfad ein?
- 23. Verkettete Liste rekursiv kopieren
- 24. Kopieren Sie ein ganzes Verzeichnis
- 25. Wie kann ich rekursiv JS-Verschönern?
- 26. Wie finde ich rekursiv in Verzeichnissen
- 27. Kopieren Verzeichnisinhalte in ein Verzeichnis mit Python
- 28. Wie kann ich ein Perl-DBIx-Recordset mit 2 Bedingungen in derselben Spalte filtern?
- 29. Erstellen Sie ein Array mit Dateinamen in einem Verzeichnis
- 30. Programmatisch rekursiv Verzeichnis erstellen
Ich denke, Sie haben ein Problem (Endlosschleife) für den Fall, dass Ihre $ regexp nicht passt "." oder "..", die die ersten beiden Werte von $ entry sind, die von readdir zurückgegeben werden. Wenn Ihr $ to_dir nicht existiert und eine $ source tatsächlich ein Verzeichnis ist, wird mkdir fehlschlagen, ich rate Ihnen stattdessen mkpath zu verwenden. – huitseeker
. und ... sind unter Windows AFAIK kein Problem, also sollte das kein Problem sein, aber für die Portabilität hast du recht, es wäre besser, diese herauszufiltern. Wie für mkpath: persönlich denke ich, dass eine solche Situation einen Fehler geben sollte, aber das ist Geschmackssache. –