Tengo dos unidades, digamos unidadA (F:) y unidadB (G:). Una vez copié todo el contenido de la unidad B en la unidad A. Pero después de eso, a la unidad B se le agregaron algunos archivos y carpetas nuevos. Me gustaría eliminar los archivos y carpetas duplicados de la unidad B y dejar solo aquellos que no existen en la unidad A.
Probé el siguiente comando solo para verificar si se encuentran duplicados, pero no funciona como quería porque tiene la ruta completa en la variable %%a
. Eso sí, la salida que tiene ahora echo %%a
será sustituida por una DEL
equivalente en caso de que funcione.
@echo off
for /F "tokens=*" %%a in ('dir G:\*.* /b /s') do if not exist "F:\%%a" echo %%a >> C:\Users\billy\Desktop\files.txt
pause
Si elimino el /s
interruptor del dir
comando, funciona porque %%a
solo tiene el nombre del archivo en lugar de la ruta completa, pero no funciona de forma recursiva para las subcarpetas, por lo que no es tan útil.
Respuesta1
@echo off
for /F "delims=" %%a in ('
dir G:\*.* /b /s /A:-D
') do if not exist "F:%%~pnxa" echo del "%%~a" >> C:\Users\billy\Desktop\files.txt
pause
Explicación:
/A:-D
excluir directorios (carpetas) de la lista, ya quedel
el comando posterior eliminaría archivos en lugar de directorios (segúndel /?
: Si se especifica un directorio, se eliminarán todos los archivos dentro del directorio, pero no se eliminará la carpeta en sí);- Trate las carpetas por separado: use otro
for /F
contradir
con/A:D
el interruptor, pero en este caso userd
en lugar deldel
comando paraeliminar una carpeta; utilícelord /S
para eliminar un árbol de carpetas completo (todos los archivos y subcarpetas además de la carpeta misma). %%~pnxa
se expande%%a
al máximoruta + nombre + extensiónincluyendo un interlineado\
(sinG:
especificación de disco);del "%%~a"
ruta completa entre comillas dobles para tratar adecuadamente las rutas con espacios;- Recomiendo
"delims="
en lugar de"tokens=*"
tratar adecuadamente los posibles espacios iniciales en los nombres de archivos (esto podría ocurrir sin/S
bandera); - considere cambios de línea de comando adicionales (consulte
del /?
yrd /?
).