
Tengo un montón de archivos almacenados en un solo directorio que deseo ordenar en subcarpetas según el primer mundo en los nombres de sus archivos.
Entonces, tengo miles de archivos que son archivos .pdf y todos tienen diferentes primeras palabras (7 caracteres numéricos).
También tengo miles de carpetas que tienen diferentes primeras palabras de 7 caracteres numéricos en el mismo directorio.
Estoy intentando mover todos los archivos .pdf a carpetas que tengan la misma primera palabra (7 caracteres).
Entonces, necesito un archivo por lotes que esencialmente verifique un archivo pdf y verifique en el mismo directorio para ver si ya existe una carpeta con los mismos primeros 7 caracteres numéricos y si mueve el .pdf a esa carpeta.
Si no existe una carpeta para el .pdf, crea una carpeta basada en los primeros siete caracteres del archivo .pdf.
Entonces, por ejemplo, tengo un pdf llamado "1617832_XXXXXXXX_XXX.pdf" y una carpeta llamada "1617832_XXXXXXXX" en el mismo directorio, quiero que "1617832_XXXXXXXX_***.pdf" se mueva a la carpeta existente "1617832_XXXXXXXX". Sin embargo, si la carpeta ""1617832_XXXXXXXX" no existe, quiero que se cree una carpeta titulada "1617832" (los primeros siete caracteres del archivo).
Luego de hacer eso, pasará al siguiente .pdf "4530834__XXXXXXXXX_XXX.pdf" y verifica las carpetas para ver si tiene una carpeta coincidente que tenga la misma primera palabra (siete caracteres) y luego mueve el archivo a esa carpeta (si existe, de lo contrario crea una nueva carpeta).
El único lote que se acerca pero tarda demasiado en ejecutarse y no crea carpetas si no existen es este:
@echo on
setlocal enabledelayedexpansion
cls
pushd c:\folders\
for /f "tokens=*" %%1 in ('dir /a-d /b *') do (
set filename=%%1&set dirname=!filename:~0,7!
for /f "tokens=*" %%A in ('dir /ad /b') do (
set dirid=%%A&set dirid=!dirid:~0,7!
if "!dirid!" equ "!dirname!" move %%1 %%A
)
)
¿Alguna forma de hacer esto de manera más eficiente y efectiva?
Respuesta1
Prueba esto:
@echo off
setlocal EnableDelayedExpansion
REM Put here the path where the PDFs are:
set "Source=%userprofile%\Desktop\test"
for %%a in ("%Source%\*.PDF") do (
set "File=%%~na"
for /d %%b in ("%Source%\*") do (
set "Folder=%%~nb"
If "!File:~0,7!"=="!Folder:~0,7!" Move "%%a" "%%b"
)
if Exist "%%a" md "!Source!\!File:~0,7!"& move /y "%%a" "!Source!\!File:~0,7!"
)
Respuesta2
- Actualizadoconsiderando este comentario:Sí, si hay dos carpetas que coinciden con los primeros 7 caracteres, me gustaría que el archivo se mueva a ambas carpetas que tengan los mismos primeros 7 caracteres.
No puedes usar el comando mover porque al moverlo será imposible hacer otra copia del mismo (archivo movido) a otra carpeta donde coincidan los primeros 7 caracteres, después de ser movido... El comando tendría que hacer copias, no mover archivos. ..
@echo off && setlocal enabledelayedexpansion
cd /d "O:\Path\Operations\Blank\Blanky\Blank Blank" && cls
for /f tokens^=* %%i in ('dir /a:d .\* /b ')do set "_folder=%%~ni" && if exist ".\%%~ni*.pdf" (
for /f tokens^=* %%F in ('dir /a:d /b ".\!_folder:~0,7!*"')do copy ".\%%~ni*.pdf" "%%~dpnF\." )
for %%F in (*.pdf)do set "_file=%%~nF" && call set "_file=!_file:~0,7!" && (
if not exist .\!_file!\. md .\!_file!\ && copy /y "%%~dpnxF" ".\!_file!\." )
:: Deleting these files was copied to multiple folders instead of being moved to folder...
(echo/ if exist .\*.pdf del .\*.pdf /q /f ) & %__APPDIR__%timeout.exe -1 & endlocal && goto :EOF
Primero trate la carpeta y vea si algún archivo coincide; después de eso, verifique los archivos restantes en la carpeta y sin destino
Si todos los archivos se han copiado a la carpeta respectiva, debe eliminar esto: simplemente elimine elecho /
dominio:
(eco/si existe .\*.pdf del .\*.pdf /q /f ) & %__APPDIR__%timeout.exe -1 & endlocal && goto :EOF