Cambiar el nombre de varios archivos en una carpeta, agregar un prefijo (Windows)

81

Me gustaría cambiar el nombre de los archivos por lotes en una carpeta, anteponiendo el nombre de la carpeta a los nuevos nombres. es decir, se C:\house chores\cambiará el nombre de todos los archivos house chores - $old_name.

ofer.sheffer
fuente

Respuestas:

146

Opción 1: usar Windows PowerShell

Abre el menú de Windows. Escriba: "PowerShell" y abra la ventana de comandos "Windows PowerShell".

Ir a la carpeta con los archivos deseados: por ejemplo, cd "C: \ tareas domésticas" Aviso: la dirección debe incluir comillas "" si hay espacios involucrados.

Puede usar 'dir' para ver todos los archivos de la carpeta. Usando '|' canalizará la salida de 'dir' para el comando que sigue.

Notas: 'dir' es un alias de 'Get-ChildItem'. Ver: wiki: cmdlets . Se pueden proporcionar más funciones. por ejemplo, 'dir -recurse' genera todos los archivos, carpetas y subcarpetas.

¿Qué pasa si solo quiero una variedad de archivos?

En lugar de 'dir |' Puedo usar:

dir | where-object -filterscript {($_.Name -ge 'DSC_20') -and ($_.Name -le 'DSC_31')} |

Para renombrar por lotes con el nombre del directorio como prefijo:

dir | Rename-Item -NewName {$_.Directory.Name + " - " + $_.Name}

Opción 2: uso del símbolo del sistema

En la carpeta, presione shift + clic derecho: seleccione 'abrir ventana de comando aquí'

for %a in (*.*) do ren "%a" "prefix - %a"

Si hay muchos archivos, podría ser bueno agregar un comando '@echo off' antes de esto y un comando 'echo on' al final.

ofer.sheffer
fuente
1
Nitpick menor: La @de @echo onque no se requiere. Te acabas de dar vuelta @echo off.
Inspectable
9
La opción 2 (después de agregar un faltante do) no funciona: después de que se haya cambiado el nombre de algunos archivos, los forencuentra con el nuevo nombre, agregando el prefijo una y otra vez hasta que se alcanza el límite de longitud del nombre de archivo.
Sergey Vlasov
2
cuando utilizo la opción 2, tengo ren was unexpected at this time.una idea de por qué?
puntero nulo
4
@billgates Falta la palabra doen su respuesta. debería serfor %a in (.) do ren "%a" "prefix - %a"
Christiaan Westerbeek
2
@SergeyVlasov Eso sucede en ambas Opciones. La única forma de evitarlo sería hacer que el cambio de nombre lo coloque sobre el original. O quizás moverlo a una carpeta diferente después de cambiar el nombre.
David Starkey
41

El problema con las dos respuestas de Powershell aquí es que el prefijo puede terminar duplicado, ya que el script se ejecutará potencialmente sobre el archivo antes y después de que se haya cambiado el nombre, dependiendo del directorio al que se recurra mientras se ejecuta el proceso de cambio de nombre. Para evitar esto, simplemente use la -Excludeopción:

Get-ChildItem -Exclude "house chores-*" | rename-item -NewName { "house chores-" + $_.Name }

Esto evitará que el proceso cambie el nombre de un archivo más de una vez.

Dave.Gugg
fuente
1
Considere agregar a su sugerencia un ejemplo menos específico, que incluye $ _. Directory.Name
ofer.sheffer
18

El software libre ' Bulk Rename Utility ' también funciona bien (y también es poderoso para tareas avanzadas). La descarga y la instalación tardan un minuto.

Vea capturas de pantalla y tutorial en el sitio web original.

-

No puedo proporcionar capturas de pantalla paso a paso, ya que las imágenes deberán publicarse bajo la licencia Creative Commons y no soy el propietario de las capturas de pantalla del software.

Descargo de responsabilidad: no estoy asociado con dicho software / compañía de ninguna manera. Me gustó el producto para mi propia tarea, cumple con los requisitos de OP y similares, por lo que lo recomiendo.


fuente
Empecé a usarlo yo mismo en algún momento. +1 por agregar algo al hilo.
ofer.sheffer
@ ofer.sheffer Gracias.
¡Esta respuesta está fuera de tema! -1
Marco Demaio
1
@MarcoDemaio Gracias por sus comentarios. El OP quiere realizar una tarea y el software vinculado facilita la tarea. Creo que la complejidad de la solución no la hace más relevante.
@GopalAggarwal: lo siento, tiene razón. Leí en su pregunta "Me gustaría cambiar el nombre de archivos por lotes en una carpeta" y pensé que estaba buscando un archivo por lotes de Windows. Quité mi -1.
Marco Demaio
9

Esto funcionó para mí, primero cd en el directorio al que le gustaría cambiar los nombres de archivo y luego ejecute el siguiente comando:

Get-ChildItem | rename-item -NewName { "house chores-" + $_.Name }
usuario3971138
fuente
5
Esto provoca un bucle infinito hasta que el nombre del archivo alcanza el límite de Windows. En su lugar, use la respuesta de @ Dave.Gugg: stackoverflow.com/a/37279979/2179408
Rob Bell
7

Me estaba arrancando el pelo porque para algunos elementos, el elemento renombrado volvería a llamarse (repetidamente, a menos que se alcanzara la longitud máxima del nombre de archivo). Esto estaba sucediendo tanto para Get-ChildItem como para canalizar la salida de dir. Supongo que los archivos renombrados se seleccionaron debido a un cambio en el orden alfabético. Resolví este problema de la siguiente manera:

Get-ChildItem -Path . -OutVariable dirs
foreach ($i in $dirs) { Rename-Item $i.name ("<MY_PREFIX>"+$i.name) }

Esto "bloquea" los resultados devueltos por Get-ChildItem en la variable $ dirs y puede iterar sobre ellos sin temor a que el pedido cambie o que sucedan otros asuntos divertidos.

El consejo de Dave.Gugg para usar -Exclude también debería resolver este problema, pero este es un enfoque diferente; quizás si los archivos que se renombran ya contienen el patrón utilizado en el prefijo.

(Descargo de responsabilidad: soy un PowerShell n00b).

fantasma-99w
fuente
2

Según la respuesta de @ ofer.sheffer, este comando cambiará el nombre de forma masiva y agregará la fecha actual al nombre del archivo. es decir, "file.txt" se convierte en "20180329 - file.txt" para todos los archivos de la carpeta actual

for %a in (*.*) do ren "%a" "%date:~-4,4%%date:~-7,2%%date:~-10,2% - %a"
karpa
fuente
2

Según la respuesta de @ ofer.sheffer, esta es la variante de CMD para agregar un afijo (esta no es la pregunta, pero esta página sigue siendo el resultado número 1 de Google si busca un afijo). Es un poco diferente debido a la extensión.

for %a in (*.*) do ren "%~a" "%~na-affix%~xa"

Puede cambiar la parte "-affix".

roverv
fuente
0

Sé que es una pregunta antigua, pero aprendí mucho de las diversas respuestas, pero se me ocurrió mi propia solución como función. Esto debería agregar dinámicamente la carpeta principal como un prefijo a todos los archivos que coincidan con un patrón determinado, pero solo si aún no tiene ese prefijo.

function Add-DirectoryPrefix($pattern) {
    # To debug, replace the Rename-Item with Select-Object
    Get-ChildItem -Path .\* -Filter $pattern -Recurse | 
        Where-Object {$_.Name -notlike ($_.Directory.Name + '*')} | 
        Rename-Item -NewName {$_.Directory.Name + '-' + $_.Name}
        # Select-Object -Property Directory,Name,@{Name = 'NewName'; Expression= {$_.Directory.Name + '-' + $_.Name}}
}

https://gist.github.com/kmpm/4f94e46e569ae0a4e688581231fa9e00

kmpm
fuente