¿Cómo copio un directorio que incluye subdirectorios excluyendo archivos o directorios que coinciden con cierta expresión regular en un sistema Windows?¿Cómo puedo copiar un directorio recursivamente y filtrar nombres de archivos en Perl?
Respuesta
me gustaría hacer algo como esto:
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;
}
No sé cómo hacer una exclusión con una copia, pero se puede trabajar algo a lo largo de las líneas de:
ls -R1 | grep -v <regex to exclude> | awk '{printf("cp %s /destination/path",$1)}' | /bin/sh
Si quieres pasar a ser en un sistema operativo similar a Unix y tener acceso a rsync (1)
, debe usar eso (por ejemplo, a través de system()
).
Perl's File :: Copy está un poco roto (no copia los permisos en los sistemas Unix, por ejemplo), así que si no quiere usar las herramientas de su sistema, mire el CPAN. Tal vez File::Copy::Recursive podría ser útil, pero no veo ninguna opción de exclusión. Espero que alguien más tenga una mejor idea.
Otra opción es File :: Xcopy. Como su nombre lo dice, emula más o menos el comando de Windows xcopy, incluidas sus opciones de filtro y recursivas.
De la documentación:
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");
Una respuesta clásica usaría 'cpio -p
':
(cd $SOURCE_DIR; find . -type f -print) |
perl -ne 'print unless m/<regex-goes-here>/' |
cpio -pd $TARGET_DIR
Los'' cpio
ofertas de comando con la copia real, incluyendo la preservación permiso. El truco de 'cd $SOURCE_DIR; find . ...
' trata de eliminar la parte principal de la ruta fuente de los nombres. El único problema con esa invocación de 'find
' es que no seguirá enlaces simbólicos; necesita agregar '-follow
' si eso es lo que desea.
hace que el trabajo en las ventanas también? – Manu
- 1. ¿Cómo puedo copiar recursivamente los contenidos del directorio usando Perl?
- 2. ¿Cómo puedo leer recursivamente directorios en Perl?
- 3. Copiar archivos o directorios recursivamente en Python
- 4. Filtrar nombres de archivos por patrón
- 5. ¿Cómo puedo usar qmake para copiar archivos recursivamente?
- 6. ¿Cómo puedo recorrer archivos en un directorio en Perl?
- 7. ¿Cómo reemplazar cadena en archivos y nombres de archivos y carpetas recursivamente con PowerShell?
- 8. Copiar varios archivos usando comodines/recursivamente usando Wix
- 9. Cómo eliminar archivos recursivamente
- 10. ¿Cómo crear recursivamente un directorio en Qt?
- 11. ¿Cómo puedo enumerar todos los archivos en un directorio usando Perl?
- 12. ¿Cómo puedo buscar y reemplazar recursivamente en un directorio en Vim?
- 13. ¿Cómo encontrar archivos/carpetas recursivamente en Perl script?
- 14. ¿Cómo eliminar el directorio recursivamente?
- 15. Búsqueda de archivos recursivamente
- 16. ¿Cómo copiar mis archivos de un directorio a otro?
- 17. Difiere un directorio recursivamente, Ignorando todos los archivos binarios:
- 18. ¿Cómo recupero todos los nombres de archivos en un directorio?
- 19. ¿Cómo puedo eliminar archivos en un directorio que se copian de otro directorio?
- 20. Cómo copiar varios archivos desde un directorio diferente usando cp?
- 21. Hacer un directorio y copiar un archivo
- 22. Hadoop Copiar un directorio?
- 23. ¿Cómo copiar un directorio en un Makefile?
- 24. Cómo copiar un directorio usando Ant
- 25. ¿Cómo puedo encontrar todos los archivos * .js en el directorio recursivamente en Linux?
- 26. Copiar archivos en la carpeta un directorio en python
- 27. Obtener nombres de archivos de un directorio en Android
- 28. iterar recursivamente sobre todos los archivos en un directorio y sus subdirectorios en Qt
- 29. ¿Cómo puedo saber cuántos archivos hay en un directorio?
- 30. Obtener recursivamente el tamaño de un directorio
Creo que tienes un problema (bucle infinito) en caso de que tu $ regexp no coincida con "." o "..", que son los dos primeros valores de $ entry devueltos por readdir. Si su $ to_dir no existe, y un $ fuente es de hecho un directorio, mkdir fallará, le aconsejo usar mkpath en su lugar. – huitseeker
. y ... no son un problema en Windows AFAIK, por lo que no debería ser un problema, pero para la portabilidad tienes razón, sería mejor filtrarlos. En cuanto a mkpath: personalmente creo que tal situación debería dar un error, pero eso es una cuestión de gusto. –