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
.
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
.
Respuestas:
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.
do
) no funciona: después de que se haya cambiado el nombre de algunos archivos, los for
encuentra con el nuevo nombre, agregando el prefijo una y otra vez hasta que se alcanza el límite de longitud del nombre de archivo.
ren was unexpected at this time.
una idea de por qué?
do
en su respuesta. debería serfor %a in (.) do ren "%a" "prefix - %a"
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 -Exclude
opció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.
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.
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 }
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).
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"
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".
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
@
de@echo on
que no se requiere. Te acabas de dar vuelta@echo off
.