Me encontré con el siguiente problema al intentar cambiar el nombre de varios cientos de imágenes en una carpeta (lo cual es un hecho, no puedo influir en ello).
Todos los archivos tienen la estructura "nombre{espacio}sufijo.JPG".
Entonces las imágenes pueden tener el mismonombre, pero en ese caso se distinguen por susufijo. P.ej
L083192 (1).JPG
L083192 (2).JPG
L083192 (3).JPG
L083192 (4).JPG
o
L081473 a.JPG
L081473 b.JPG
El objetivo es añadir un contador (como prefijo) a todas las imágenes con el mismo nombre. Es decir
1_L083192 (1).JPG
1_L083192 (2).JPG
1_L083192 (3).JPG
1_L083192 (4).JPG
[..]
16_L081473 a.JPG
16_L081473 b.JPG
El contador se calcula en un bucle "FOR/F" que establece qué nombres son idénticos, por lo que deberían obtener el mismo prefijo.
Pero cuando intento agregar el contraprefijo aplicando el siguiente comando REN:
ren "%%h*" "!cnt!_%%h*"
Me meto en problemas.
( %%h and !cnt! are variables of the "FOR /F" loop
)
Esta es la salida correspondiente:
L083192 (1).jpg >> 1_L0831921).jpg [i.e. " (" gone missing]
[..]
L083192 (4).jpg >> 1_L0831924).jpg [id.]
Los dos archivos "L081473" incluso dan como resultado unsolteroarchivo de salida (sin sufijo)!
16_L081473.JPG
Sin duda existe un vínculo con los mecanismos descritos por dbenham en supublicación extensa sobre el comando REN(AME), pero no puedo resolverlo para el caso anterior, ya que esperaría que los nombres de los archivos originales se truncaran, en lugar de que se pierdan algunos caracteres intermedios en el proceso. Tal vez el espacio en el nombre del archivo original sea la razón, aunque cité estos nombres de archivo en el REN
comando para acomodar espacios. ¿Alguien puede explicarlo?
Además, como REN
parece que no puedo producir el resultado buscado (¿o sí?), ¿cómo puedo obtener el resultado deseado utilizando un lote simple?
También intenté solucionar el REN
problema usando COPY
o XCOPY
, pero los resultados son idénticos. Estos comandos parecen aplicar el mismo esquema, como sugiere cuidadosamente dbenhamen la misma publicacion(ver la nota).
Archivo por lotes
FOR /F %%h IN (input.txt) DO (
IF NOT "%%h" == "prev" (set /A cnt+=1)
[some more logic..]
cd Images
ren "%%h*" "!cnt!_%%h*"
cd..
[some more logic..]
set prev=%%h
)
Nota:Le quité al lote su lógica adicional, lo que también evita que se cambie el nombre de un archivo más de una vez. El "input.txt" contiene todas las apariciones del nombre únicamente (es decir, sin sufijo), lo cual es suficiente para calcular el prefijo. Podría proporcionar un archivo de muestra, pero no encontré cómo vincularlo a este mensaje. Además, eso no permitiría replicar el cambio de nombre (además, la carpeta "Imágenes" mide aproximadamente 480 Mb).
Los nombres completos de los archivos en esta carpeta se tienen en cuenta cambiando al subdirectorio "Imágenes", donde los archivos esperan ser renombrados. ( REN
funciona sólo en el directorio actual)
Respuesta1
Te perdiste o no te diste cuenta del significado de este párrafo en mi publicación RENAME:
Cualquier nombre se puede dividir en componentes delimitados por
.
Caracteres que solo se pueden agregar o eliminar al final de cada componente.No se pueden eliminar ni agregar caracteres al principio o a la mitad de un componente mientras se conserva el resto con comodines.. Se permiten sustituciones en cualquier lugar.
Está intentando agregar caracteres al principio del nombre base, conservando el nombre base con un comodín. Según mi declaración anterior, esto no se puede hacer. Tendrás que cambiar el nombre de cada archivo individualmente. Esto no debería ser particularmente difícil. Supongo que tu otra lógica es correcta:
FOR /F %%h IN (input.txt) DO (
IF NOT "%%h" == "prev" (set /A cnt+=1)
[some more logic..]
cd Images
for %%F in ("%%h*") do ren "%%F" "!cnt!_%%F"
cd..
[some more logic..]
set prev=%%h
)
Tenga en cuenta que el código fallará si %%F
contiene !
debido a que se ha habilitado la expansión retrasada. Eso se puede solucionar con un poco más de código. Es mejor comenzar con la expansión retrasada deshabilitada y luego habilitarla temporalmente según sea necesario.
setlocal enableDelayedExpansion
for %%N in (!cnt!) do (
endlocal
for %%F in ("%%h*") do ren "%%F" "%%N_%%F"
)