Estas reglas fueron descubiertas después de extensas pruebas en una máquina Vista. No se realizaron pruebas con Unicode en los nombres de archivo.
RENAME requiere 2 parámetros: una máscara de origen, seguida de una máscara de destino. Tanto sourceMask como targetMask pueden contener *
y / o ?
comodines. El comportamiento de los comodines cambia ligeramente entre las máscaras de origen y destino.
Nota : REN se puede usar para cambiar el nombre de una carpeta, pero los comodines no están permitidos en sourceMask o targetMask al cambiar el nombre de una carpeta. Si sourceMask coincide con al menos un archivo, se cambiará el nombre de los archivos y se ignorarán las carpetas. Si sourceMask solo coincide con carpetas y no con archivos, se genera un error de sintaxis si aparecen comodines en el origen o el destino. Si sourceMask no coincide con nada, se produce un error de "archivo no encontrado".
Además, al cambiar el nombre de los archivos, los comodines solo se permiten en la parte del nombre del archivo de la máscara de origen. Los comodines no están permitidos en la ruta que conduce al nombre del archivo.
fuenteMáscara
SourceMask funciona como un filtro para determinar qué archivos se renombran. Los comodines funcionan aquí igual que con cualquier otro comando que filtre los nombres de los archivos.
?
- Coincide con cualquier carácter 0 o 1 excepto .
Este comodín es codicioso: siempre consume el siguiente carácter si no es un .
Sin embargo, no coincidirá con nada sin fallar si al final del nombre o si el siguiente carácter es un.
*
- Coincide con 0 o más caracteres incluidos .
(con una excepción a continuación). Este comodín no es codicioso. Coincidirá tanto o tan poco como sea necesario para permitir que los caracteres posteriores coincidan.
Todos los caracteres que no son comodines deben coincidir entre sí, con algunas excepciones de casos especiales.
.
- Coincide o puede coincidir con el final del nombre (nada) si no quedan más caracteres. (Nota: un nombre de Windows válido no puede terminar con .
)
{space}
- Coincide o puede coincidir con el final del nombre (nada) si no quedan más caracteres. (Nota: un nombre de Windows válido no puede terminar con {space}
)
*.
al final: coincide con 0 o más caracteres, excepto que .
la terminación .
puede ser una combinación de .
y {space}
siempre y cuando el último carácter de la máscara sea .
Esta es la única excepción en la *
que no coincide simplemente con ningún conjunto de caracteres.
Las reglas anteriores no son tan complejas. Pero hay una regla más importante que hace que la situación sea confusa: SourceMask se compara con el nombre largo y el nombre corto 8.3 (si existe). Esta última regla puede hacer que la interpretación de los resultados sea muy complicada, ya que no siempre es obvio cuando la máscara coincide con el nombre corto.
Es posible usar RegEdit para deshabilitar la generación de nombres cortos de 8.3 en volúmenes NTFS, en cuyo punto la interpretación de los resultados de la máscara de archivo es mucho más sencilla. Los nombres cortos que se generaron antes de deshabilitar los nombres cortos permanecerán.
targetMask
Nota: no he realizado ninguna prueba rigurosa, pero parece que estas mismas reglas también funcionan para el nombre de destino del comando COPY
TargetMask especifica el nuevo nombre. Siempre se aplica al nombre largo completo; TargetMask nunca se aplica al nombre corto 8.3, incluso si sourceMask coincide con el nombre corto 8.3.
La presencia o ausencia de comodines en sourceMask no tiene ningún impacto en cómo se procesan los comodines en targetMask.
En la siguiente discusión - c
representa cualquier carácter que no es *
, ?
o.
TargetMask se procesa contra el nombre de origen estrictamente de izquierda a derecha sin retroceso.
c
- Avanza la posición dentro del nombre de la fuente siempre que el siguiente carácter no lo sea .
y anexe c
al nombre de destino. (Reemplaza el personaje que estaba en origen con c
, pero nunca reemplaza .
)
?
- Coincide con el siguiente carácter del nombre largo de origen y lo agrega al nombre de destino siempre que el siguiente carácter no lo sea. .
Si el siguiente carácter es .
o si al final del nombre de origen no se agrega ningún carácter al resultado y al actual la posición dentro del nombre de la fuente no cambia.
*
al final de targetMask: agrega todos los caracteres restantes desde el origen al destino. Si ya está al final de la fuente, entonces no hace nada.
*c
- c
Hace coincidir todos los caracteres de origen desde la posición actual hasta la última aparición de (coincidencia codiciosa entre mayúsculas y minúsculas) y agrega el conjunto de caracteres coincidentes al nombre del objetivo. Si c
no se encuentra, se agregan todos los caracteres restantes de la fuente, seguidos de c
Esta es la única situación que conozco donde la coincidencia de patrones de archivos de Windows distingue entre mayúsculas y minúsculas.
*.
- Hace coincidir todos los caracteres de origen desde la posición actual hasta la última aparición de .
(coincidencia codiciosa) y agrega el conjunto de caracteres coincidentes al nombre del objetivo. Si .
no se encuentra, se añaden todos los caracteres restantes de la fuente, seguidos de.
*?
- Añade todos los personajes restantes desde el origen al destino. Si ya está al final de la fuente, entonces no hace nada.
.
sin *
delante: avanza la posición en origen a través de la primera aparición de .
sin copiar ningún carácter, y se agrega .
al nombre del objetivo. Si .
no se encuentra en la fuente, avanza hasta el final de la fuente y se agrega .
al nombre de destino.
Después de que targetMask se haya agotado, cualquier final .
y {space}
se recorta al final del nombre de destino resultante porque los nombres de archivo de Windows no pueden terminar con .
o{space}
Algunos ejemplos prácticos
Sustituya un personaje en la primera y tercera posición antes de cualquier extensión (agrega un segundo o tercer carácter si aún no existe)
ren * A?Z*
1 -> AZ
12 -> A2Z
1.txt -> AZ.txt
12.txt -> A2Z.txt
123 -> A2Z
123.txt -> A2Z.txt
1234 -> A2Z4
1234.txt -> A2Z4.txt
Cambiar la extensión (final) de cada archivo
ren * *.txt
a -> a.txt
b.dat -> b.txt
c.x.y -> c.x.txt
Agregar una extensión a cada archivo
ren * *?.bak
a -> a.bak
b.dat -> b.dat.bak
c.x.y -> c.x.y.bak
Elimine cualquier extensión adicional después de la extensión inicial. Tenga en cuenta que ?
debe usarse adecuado para preservar el nombre completo existente y la extensión inicial.
ren * ?????.?????
a -> a
a.b -> a.b
a.b.c -> a.b
part1.part2.part3 -> part1.part2
123456.123456.123456 -> 12345.12345 (note truncated name and extension because not enough `?` were used)
Igual que el anterior, pero filtre los archivos con nombre inicial y / o extensión de más de 5 caracteres para que no se trunquen. (Obviamente, podría agregar un adicional ?
en cualquier extremo de targetMask para preservar nombres y extensiones de hasta 6 caracteres de largo)
ren ?????.?????.* ?????.?????
a -> a
a.b -> a.b
a.b.c -> a.b
part1.part2.part3 -> part1.part2
123456.123456.123456 (Not renamed because doesn't match sourceMask)
Cambie los caracteres después del último _
nombre e intente preservar la extensión. (No funciona correctamente si _
aparece en la extensión)
ren *_* *_NEW.*
abcd_12345.txt -> abcd_NEW.txt
abc_newt_1.dat -> abc_newt_NEW.dat
abcdef.jpg (Not renamed because doesn't match sourceMask)
abcd_123.a_b -> abcd_123.a_NEW (not desired, but no simple RENAME form will work in this case)
Cualquier nombre se puede dividir en componentes que están delimitados por .
caracteres. Solo se pueden agregar o eliminar del final de cada componente. Los caracteres no pueden eliminarse ni agregarse al principio o al medio de un componente mientras se conserva el resto con comodines. Se permiten sustituciones en cualquier lugar.
ren ??????.??????.?????? ?x.????999.*rForTheCourse
part1.part2 -> px.part999.rForTheCourse
part1.part2.part3 -> px.part999.parForTheCourse
part1.part2.part3.part4 (Not renamed because doesn't match sourceMask)
a.b.c -> ax.b999.crForTheCourse
a.b.CarPart3BEER -> ax.b999.CarParForTheCourse
Si los nombres cortos están habilitados, una máscara de origen con al menos 8 ?
para el nombre y al menos 3 ?
para la extensión coincidirá con todos los archivos porque siempre coincidirá con el nombre corto 8.3.
ren ????????.??? ?x.????999.*rForTheCourse
part1.part2.part3.part4 -> px.part999.part3.parForTheCourse
¿Capricho / error útil? para eliminar prefijos de nombre
Esta publicación de SuperUser describe cómo /
se puede usar un conjunto de barras diagonales ( ) para eliminar los caracteres iniciales del nombre de un archivo. Se requiere una barra oblicua para cada carácter que se va a eliminar. He confirmado el comportamiento en una máquina con Windows 10.
ren "abc-*.txt" "////*.txt"
abc-123.txt --> 123.txt
abc-HelloWorld.txt --> HelloWorld.txt
Esta técnica solo funciona si las máscaras de origen y destino están encerradas entre comillas dobles. Todos los siguientes formularios sin las comillas requeridas fallan con este error:The syntax of the command is incorrect
REM - All of these forms fail with a syntax error.
ren abc-*.txt "////*.txt"
ren "abc-*.txt" ////*.txt
ren abc-*.txt ////*.txt
No /
se puede utilizar para eliminar ningún carácter en el medio o al final de un nombre de archivo. Solo puede eliminar los caracteres iniciales (prefijo).
Técnicamente, el /
no funciona como comodín. Por el contrario, se trata de una simple sustitución de caracteres, pero luego de la sustitución, el comando REN reconoce que /
no es válido en un nombre de archivo y elimina las /
barras diagonales del nombre. REN da un error de sintaxis si detecta /
en el medio de un nombre de destino.
Posible error de RENAME: ¡un solo comando puede cambiar el nombre del mismo archivo dos veces!
Comenzando en una carpeta de prueba vacía:
C:\test>copy nul 123456789.123
1 file(s) copied.
C:\test>dir /x
Volume in drive C is OS
Volume Serial Number is EE2C-5A11
Directory of C:\test
09/15/2012 07:42 PM <DIR> .
09/15/2012 07:42 PM <DIR> ..
09/15/2012 07:42 PM 0 123456~1.123 123456789.123
1 File(s) 0 bytes
2 Dir(s) 327,237,562,368 bytes free
C:\test>ren *1* 2*3.?x
C:\test>dir /x
Volume in drive C is OS
Volume Serial Number is EE2C-5A11
Directory of C:\test
09/15/2012 07:42 PM <DIR> .
09/15/2012 07:42 PM <DIR> ..
09/15/2012 07:42 PM 0 223456~1.XX 223456789.123.xx
1 File(s) 0 bytes
2 Dir(s) 327,237,562,368 bytes free
REM Expected result = 223456789.123.x
Creo que sourceMask *1*
primero coincide con el nombre de archivo largo, y el archivo cambia de nombre al resultado esperado de 223456789.123.x
. RENAME continúa buscando más archivos para procesar y encuentra el archivo recién nombrado a través del nuevo nombre corto de 223456~1.X
. El archivo se renombra nuevamente dando el resultado final de 223456789.123.xx
.
Si deshabilito la generación de nombres 8.3, entonces RENAME da el resultado esperado.
No he resuelto completamente todas las condiciones de activación que deben existir para inducir este comportamiento extraño. Me preocupaba que pudiera ser posible crear un RENAME recursivo interminable, pero nunca pude inducir uno.
Creo que todo lo siguiente debe ser cierto para inducir el error. Todos los casos con errores que vi tenían las siguientes condiciones, pero no todos los casos que cumplían las siguientes condiciones tenían errores.
- Los nombres cortos de 8.3 deben estar habilitados
- SourceMask debe coincidir con el nombre largo original.
- El cambio de nombre inicial debe generar un nombre corto que también coincida con la máscara de origen
- El nombre corto renombrado inicial debe clasificarse más tarde que el nombre corto original (si existiera)