2012-04-18 99 views
11

Estoy tratando de cambiar todos los nombres de los archivos en una carpeta actual y estoy tratando de lograr esto eliminando el prefijo de los archivos (cada archivo tiene un prefijo común) o cambiando sus nombres a su cuenta (si hay 5 archivos, los nombres de archivo serán 1.txt 2.txt 3.txt 4.txt 5.txt).Renombrar (o eliminar el prefijo) varios archivos a cada número

Ahora he encontrado el comando ren en cmd y lo jugué un poco pero hasta ahora no he podido lograr el resultado y solo puedo ejecutar esto en cmd, por lo que no se pueden usar archivos por lotes.

Esto es lo más cerca que llegué, pero sólo añade un prefijo:

FOR %f IN (*.*) DO ren %f prefix%f 

He tratado de hacer lo contrario:

FOR %f IN (*.*) DO ren prefix%f %f 

Pero, por supuesto, no funcionó por lo que ahora estoy pidiendo ayuda y alguna explicación si es posible (me gusta entender cómo funcionan estas cosas). Gracias de antemano por cualquier ayuda.

+0

Estos comandos ni siquiera parecen funcionar bien con directorios muy grandes. Sigue añadiendo prefijo a los archivos en los que ya ha agregado el prefijo. – hnviet

Respuesta

24

No entiendo por qué no puede usar un archivo por lotes. Pero aquí hay una solución que debería funcionar con la mayoría de los nombres de archivos.

crítico - primero hay que asegurarse de que tiene un nombre de variable no definida, voy a utilizar fnombre

set "fname=" 

El siguiente es el comando para hacer realidad el cambio de nombre. No funcionará correctamente si fname ya está definido.

for %a in (prefix*.txt) do @(set "fname=%a" & call ren "%fname%" "%fname:*prefix=%") 

La variable fname se define para cada iteración y luego la sintaxis %fname:*prefix=% sustituye a la primera ocurrencia de "prefijo" con nada. Lo complicado es que Windows intenta primero expandir% fname% cuando el comando se analiza por primera vez. Por supuesto, eso no funcionará porque aún no se ha definido. En la línea de comandos, los porcentajes se conservan si no se encuentra la variable. La llamada provoca una fase de expansión adicional que ocurre después de la variable se ha establecido, por lo que la expansión funciona.

Si se define fname antes de ejecutar el comando, simplemente intentará cambiar el nombre del mismo archivo para cada iteración en lugar del valor que se le asigna dentro del ciclo.

Si desea ejecutar nuevamente el comando con un prefijo diferente, primero deberá borrar la definición.

EDITAR - Aquí es un archivo por lotes denominado "RemovePrefix.bat" que hace el trabajo

::RemovePrefix.bat prefix fileMask 
@echo off 
setlocal 
for %%A in ("%~1%~2") do (
    set "fname=%%~A" 
    call ren "%%fname%%" "%%fname:*%~1=%%" 
) 

Supongamos que había nombrado como archivos "prefixName.txt", entonces deberías usar la secuencia de comandos mediante la ejecución de

RemovePrefix "prefix" "*.txt" 

El archivo por lotes cambiará el nombre de los archivos en su directorio actual. El archivo por lotes también tendrá que estar en su directorio actual a menos que el archivo por lotes exista en un directorio que esté en su variable PATH. O puede especificar la ruta completa al archivo de proceso por lotes cuando lo llame.

Las reglas para la expansión son diferentes en un archivo por lotes.PARA las variables se debe hacer referencia como %% A en lugar de% A, y %% fname %% no se expande inicialmente, en cambio los porcentajes dobles se convierten en porcentajes individuales y luego% fname% se expande después de la LLAMADA. No importa si fname ya está definido con el archivo por lotes. SETLOCAL hace que la definición de fname sea temporal (local) en el archivo por lotes.

+0

Perfecto, muchas gracias por la explicación adicional también! Editar: al igual que una solicitud adicional, ¿podría publicar un ejemplo si se puede hacer en un archivo por lotes? – Shadow

+0

No sé cómo fue perfecto: había un desagradable error donde% f se confundía con% f en% fname%. Todo arreglado ahora :) – dbenham

+0

¿Qué modificación debo hacer en este script de modo que busque '" .txt "' en cada directorio secundario del directorio actual y elimine el 'prefijo' dado? – Kushal

23

Una solución mucho más simple se proporciona en
https://superuser.com/a/871799/497147

lo copié aquí para un acceso más fácil.

Olvídese de los scripts complicados para esto.

rename es un comando muy antiguo y nunca completado correctamente. Si no lo usa correctamente, el resultado puede sorprenderlo.

Por ejemplo, para eliminar un prefijo abcd de abcd1.txt, abcd2.txt, abcd3.txt etc con el fin de obtener 1.txt, 2.txt, 3.txt simplemente utilizar

rename "abcd*.txt" "////*.txt" 

Se necesita el mismo número de / como el número de caracteres iniciales te gustaría eliminar

Poner comillas dobles para ambos argumentos.

+0

Salvador del día. –

+0

Técnica muy genial y extraña. He actualizado mi [¿Cómo interpreta el comando RENAME de Windows los comodines?] (Https://superuser.com/q/475874/109090) Preguntas y respuestas sobre SuperUser con esta información, aunque técnicamente, el '/' no funciona como un comodín tarjeta. – dbenham

+0

Increíblemente simple y perfectamente funcional. Tenga en cuenta que el número de "/" no está relacionado con cuántos caracteres se especifican en la expresión coincidente. Otro ejemplo: 'rename" IM *. * "" ////*.* "' coincide en un prefijo de 2 caracteres y elimina 4 caracteres – PaoloC

Cuestiones relacionadas