windows - maxage - robocopy/mt
Cómo copiar una estructura de directorio pero solo incluir ciertos archivos(usando archivos de lotes de Windows) (15)
Bajo Linux y otros sistemas UNIX, usar el comando tar
haría esto fácilmente.
$ tar cvf /tmp/full-structure.tar *data.zip *info.txt
Luego harías clic en el objetivo y:
$ tar xvf /tmp/full-structure.tar
Por supuesto, puede canalizar la salida desde el primer alquitrán al segundo, pero ver que funciona en pasos es más fácil de entender y explicar. Me falta el cd / to / new / path / necesario en el siguiente comando: simplemente no recuerdo cómo hacerlo ahora. Alguien más puede agregarlo, con suerte.
$ tar cvf - *data.zip *info.txt | tar xvf -
Tar (gnutar) también está disponible en Windows, pero probablemente xcopy
método xcopy
en esa plataforma.
Como dice el título, ¿cómo puedo copiar recursivamente una estructura de directorio pero solo incluir algunos archivos? Por ejemplo, dada la siguiente estructura de directorio:
folder1
folder2
folder3
data.zip
info.txt
abc.xyz
folder4
folder5
data.zip
somefile.exe
someotherfile.dll
Los archivos data.zip e info.txt pueden aparecer en todas partes en la estructura del directorio. ¿Cómo puedo copiar la estructura de directorios completa, pero solo incluir archivos llamados data.zip e info.txt (se deben ignorar todos los demás archivos)?
La estructura de directorios resultante debería verse así:
copy_of_folder1
folder2
folder3
data.zip
info.txt
folder4
folder5
data.zip
Con find y cp solo:
mkdir /tmp/targetdir
cd sourcedir
find . -type f -name ''*.zip'' -exec cp -p --parents {} /tmp/targetdir ";"
find . -type f -name ''*.txt'' -exec cp -p --parents {} /tmp/targetdir ";"
Estoy de acuerdo con las expresiones regulares, perezoso y reacio a las instalaciones, así que creé un archivo por lotes que crea el directorio y las copias con los comandos DOS de vanilla. Parece laborioso pero más rápido para mí que entrenar robocopy.
- Cree su lista de archivos de origen con rutas completas, incluida la letra de unidad si es nec, en un archivo de texto.
- Encienda expresiones regulares en su editor de texto.
- Agregue comillas dobles alrededor de cada línea en caso de espacios - cadena de búsqueda
(.*)
Reemplace la cadena"/1"
y haga clic en reemplazar todo - Cree dos líneas por archivo: una para crear el directorio, otra para copiar el archivo (qqq se reemplazará con la ruta de destino) - buscar cadena
(.*)
Reemplazar la cadenamd qqq/1/nxcopy /1 qqq/1/n
y hacer clic reemplaza todo - Elimine el nombre de archivo de las rutas de destino - busque
//([^//^"]+)"/n
replace//"/n
- Reemplace en la ruta de destino (en este ejemplo
A:/src
yB:/dest
). Desactive expresiones regulares, busqueqqq"A:/src/
replaceB:/dest/
y haga clic en reemplazar todo".
md creará directorios anidados. la copia probablemente se comportaría de manera idéntica a xcopy en este ejemplo. Es posible que desee agregar / Y a xcopy para suprimir confirmaciones de sobrescritura. Usted termina con un archivo por lotes como ese:
md "B:/dest/a/b/c/"
xcopy "C:/src/a/b/c/e.xyz" "B:/dest/a/b/c/e.xyz"
repetido para cada archivo en su lista original. Probado en Win7.
Gracias a las respuestas anteriores. :)
Este script llamado "r4k4copy.cmd":
@echo off
for %%p in (SOURCE_DIR DEST_DIR FILENAMES_TO_COPY) do set %%p=
cls
echo :: Copy Files Including Folder Tree
echo :: http://.com
rem /questions/472692/how-to-copy
rem -a-directory-structure-but-only
rem -include-certain-files-using-windows
echo :: ReScripted by r4k4
echo.
if "%1"=="" goto :NoParam
if "%2"=="" goto :NoParam
if "%3"=="" goto :NoParam
setlocal enabledelayedexpansion
set SOURCE_DIR=%1
set DEST_DIR=%2
set FILENAMES_TO_COPY=%3
for /R "%SOURCE_DIR%" %%F IN (%FILENAMES_TO_COPY%) do (
if exist "%%F" (
set FILE_DIR=%%~dpF
set FILE_INTERMEDIATE_DIR=!FILE_DIR:%SOURCE_DIR%=!
xcopy /E /I /Y "%%F" "%DEST_DIR%!FILE_INTERMEDIATE_DIR!"
)
)
goto :eof
:NoParam
echo.
echo Syntax: %0 [Source_DIR] [Dest_DIR] [FileName]
echo Eg. : %0 D:/Root E:/Root/Lev1/Lev2/Lev3 *.JPG
echo Means : Copy *.JPG from D:/Root to E:/Root/Lev1/Lev2/Lev3
Acepta variables de "Fuente", "Destino" y "Nombre de archivo". También solo puede copiar tipos de archivos especificados o nombres de archivos selectivos.
Cualquier mejora es bienvenida. :)
No menciona si debe ser solo por lotes, pero si puede usar ROBOCOPY
, intente esto:
ROBOCOPY C:/Source C:/Destination data.zip info.txt /E
EDITAR: Cambió el parámetro /S
a /E
para incluir carpetas vacías.
Para aquellos que usan Altap Salamander (administrador de archivos de 2 paneles): en la ventana emergente Opciones de la copia, simplemente especifique los nombres de los archivos o las máscaras. Fácil.
Para copiar todos los archivos de texto a G: y conservar la estructura del directorio:
xcopy *.txt /s G:
Para hacer esto con arrastrar y soltar use winzip hay una opción de preservación de estructura dir. Simplemente cree un nuevo .zip en el nivel de directorio que será su raíz y arrastre los archivos.
Si Powershell es una opción, puede hacer esto:
Copy-Item c:/sourcePath d:/destinationPath -filter data.zip -recurse
La principal desventaja es que copia todas las carpetas, incluso si terminarán vacías porque ningún archivo coincide con el filtro que especifique. Por lo tanto, podría terminar con un árbol lleno de carpetas vacías, además de las pocas carpetas que tienen los archivos que desea.
Similar a la solución de Paulius, pero los archivos que no te importan no se copian y luego se eliminan:
@echo OFF
:: Replace c:/temp with the directory where folder1 resides.
cd c:/temp
:: You can make this more generic by passing in args for the source and destination folders.
for /f "usebackq" %%I in (`dir /b /s /a:-d folder1`) do @echo %%~nxI | find /V "data.zip" | find /v "info.txt" >> exclude_list.txt
xcopy folder1 copy_of_folder1 /EXCLUDE:exclude_list.txt /E /I
Solo son dos comandos simples, pero no recomendaría esto, a menos que los archivos que NO es necesario copiar sean pequeños. Esto se debe a que esto copiará TODOS los archivos y luego eliminará los archivos que no se necesitan en la copia.
xcopy /E /I folder1 copy_of_folder1
for /F "tokens=1 delims=" %i in (''dir /B /S /A:-D copy_of_files ^| find /V "info.txt" ^| find /V "data.zip"'') do del /Q "%i"
Claro, el segundo comando es algo largo, ¡pero funciona!
Además, este enfoque no requiere que descargue e instale herramientas de terceros (Windows 2000+ BATCH tiene suficientes comandos para esto).
Una solución alternativa que copia un archivo a la vez y no requiere ROBOCOPY:
@echo off
setlocal enabledelayedexpansion
set SOURCE_DIR=C:/Source
set DEST_DIR=C:/Destination
set FILENAMES_TO_COPY=data.zip info.txt
for /R "%SOURCE_DIR%" %%F IN (%FILENAMES_TO_COPY%) do (
if exist "%%F" (
set FILE_DIR=%%~dpF
set FILE_INTERMEDIATE_DIR=!FILE_DIR:%SOURCE_DIR%=!
xcopy /E /I /Y "%%F" "%DEST_DIR%!FILE_INTERMEDIATE_DIR!"
)
)
La sentencia externa para genera cualquier combinación de ruta posible de subdirectorio en SOURCE_DIR
y el nombre en FILENAMES_TO_COPY
. Para cada archivo existente se invoca xcopy. FILE_INTERMEDIATE_DIR
contiene la ruta del subdirectorio del archivo dentro de SOURCE_DIR
que debe crearse en DEST_DIR
.
Usando la interfaz de línea de comandos de WinRAR, puede copiar los nombres de archivo y / o tipos de archivo a un archivo. Entonces puedes extraer ese archivo a cualquier ubicación que desees. Esto preserva la estructura original del archivo.
Necesitaba agregar archivos de imágenes de álbumes perdidos a mi teléfono móvil sin tener que volver a copiar la música. Afortunadamente, la estructura del directorio era la misma en mi computadora y mi dispositivo móvil.
Solía:
rar a -r C:/Downloads/music.rar X:/music/Folder.jpg
- C: / Downloads / music.rar = Archivo que se creará
- X: / music / = Carpeta que contiene archivos de música
- Folder.jpg = Nombre de archivo que quería copiar
Esto creó un archivo con todos los archivos Folder.jpg en los subdirectorios apropiados.
Esta técnica también se puede usar para copiar tipos de archivos. Si todos los archivos tienen nombres diferentes, puede optar por extraer todos los archivos a un solo directorio. Los parámetros adicionales de la línea de comandos pueden archivar múltiples tipos de archivos.
Más información en este útil enlace http://cects.com/using-the-winrar-command-line-tools-in-windows/
intente conectar la salida de find (es decir, la ruta del archivo) a cpio
find . -type f -name ''*.jpg'' | cpio -p -d -v targetdir/
cpio comprueba la marca de tiempo en los archivos de destino, por lo que es seguro y rápido.
elimine -v para una operación más rápida, una vez que se acostumbre.
XCOPY /S folder1/data.zip copy_of_folder1
XCOPY /S folder1/info.txt copy_of_folder1
EDITAR: si desea conservar las carpetas vacías (que, al releer su publicación, parece) use / E en lugar de / S.