¿Cómo interpreta el comando RENAME de Windows (REN) los comodines?
La función de AYUDA incorporada no sirve de nada: no aborda los comodines en absoluto.
La ayuda en línea de Microsoft technet XP no es mucho mejor. Aquí está todo lo que tiene que decir con respecto a los comodines:
"Puede usar comodines (
*
y?
) en cualquiera de los parámetros de nombre de archivo. Si usa comodines en filename2, los caracteres representados por los comodines serán idénticos a los caracteres correspondientes en filename1".
No es de mucha ayuda, hay muchas maneras en que esa declaración puede ser interpretada.
Me las arreglé para usar con éxito los comodines en el parámetro filename2 en algunas ocasiones, pero siempre ha sido prueba y error. No he podido anticipar qué funciona y qué no. Con frecuencia he tenido que recurrir a escribir un pequeño script por lotes con un bucle FOR que analiza cada nombre para poder construir cada nuevo nombre según sea necesario. No muy conveniente
Si supiera las reglas sobre cómo se procesan los comodines, creo que podría usar el comando RENAME de manera más efectiva sin tener que recurrir al lote con tanta frecuencia. Por supuesto, conocer las reglas también beneficiaría el desarrollo por lotes.
(Sí, este es un caso en el que estoy publicando una pregunta y una respuesta combinadas. Me cansé de no conocer las reglas y decidí experimentar por mi cuenta. Creo que muchos otros pueden estar interesados en lo que descubrí)
fuente
*
, Windows sí. Eso tiene enormes consecuencias. Aunque desearía haber sabido sobre ese sitio; Podría haber facilitado mi investigación. Las reglas MSDOS7 son significativamente diferentes de las viejas reglas de DOS antes de los nombres largos de archivos, y son un paso en la dirección de cómo Windows lo maneja. Había encontrado las reglas de DOS de nombre de archivo prelargo, y no valían para mi investigación.Respuestas:
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 anexec
al nombre de destino. (Reemplaza el personaje que estaba en origen conc
, 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. Sic
no se encuentra, se agregan todos los caracteres restantes de la fuente, seguidos dec
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)
Cambiar la extensión (final) de cada archivo
Agregar una extensión a cada archivo
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.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)Cambie los caracteres después del último
_
nombre e intente preservar la extensión. (No funciona correctamente si_
aparece en la extensión)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.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.¿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.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
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:
Creo que sourceMask
*1*
primero coincide con el nombre de archivo largo, y el archivo cambia de nombre al resultado esperado de223456789.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 de223456~1.X
. El archivo se renombra nuevamente dando el resultado final de223456789.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.
fuente
REN /?
.Copy of
prefijo utilizando una oscura técnica de barra diagonal:ren "Copy of *.txt" "////////*"
Similar a exebook, aquí hay una implementación de C # para obtener el nombre de archivo de destino de un archivo fuente.
Encontré 1 pequeño error en los ejemplos de dbenham:
Aquí está el código:
Y aquí hay un método de prueba de NUnit para probar los ejemplos:
fuente
He logrado escribir este código en BASIC para enmascarar los nombres de archivo comodín:
fuente
Quizás alguien pueda encontrar esto útil. Este código JavaScript se basa en la respuesta de dbenham anterior.
No probé
sourceMask
mucho, perotargetMask
coincide con todos los ejemplos dados por dbenham.fuente