¿Qué comando puedo usar para renombrar o mover recursivamente un archivo en Windows?


Respuestas:


56

Usa el forcomando XP . Por ejemplo, desde la línea de comando (en su %%xlugar, use un archivo por lotes ) para hacer un movimiento recursivo:

for /r %x in (foo) do move "%x" "drive:\path\bar"

Para hacer un cambio de nombre recursivo:

for /r %x in (*.c) do ren "%x" *.cpp

Ejemplo de lote:

for /r "< DIR >" %%x in (*.c) do ren "%%x" *.cpp

Esta es, con mucho, la solución más simple, ¡muchas gracias!
javamonkey79

Para usar el comando FOR en un programa por lotes, especifique %% variable en lugar de% variable.
Tom Robinson

¿Cómo se hace esto a un directorio de origen diferente sin cwd'ing?
Evan Carroll

Estoy tratando de usar esto para reemplazar cada archivo '% 20' en cada archivo con un simple ''. ¿Cómo hago esto?
Mike Warren

@RobKam, en realidad el bucle for funciona pero solo renombra 1 archivo ... ¿cómo configuro el comodín para reconocer que funcionarán múltiples extensiones de archivo *.*?
DJ KRAZE

3

robocopy "C:\Source Folder" "C:\Destination Folder" /E /COPYALL /XJ


Description of parameters:
/E - copy subdirectories, including Empty ones (/S to exclude empty ones)
/COPYALL - COPY ALL file info (equivalent to /COPY:DATSOU)
/XJ - eXclude Junction points and symbolic links. (normally included by default).

2

Acabo de ejecutar un pequeño ejemplo en mi cuadro de Windows XP SP2 con el comando mover y funcionó. Todos los archivos y directorios se movieron de origen a destino. fuente y dest son nombres de directorio.

mover origen dest
ver

Microsoft Windows XP [Versión 5.1.2600]
mover /?

Mueve archivos y renombra archivos y directorios.

Para mover uno o más archivos:
MOVER [/ Y | / -Y] [unidad:] [ruta] nombre de archivo1 [, ...] destino

Para cambiar el nombre de un directorio:
MOVER [/ Y | / -Y] [unidad:] [ruta] dirname1 dirname2

  [unidad:] [ruta] filename1 Especifica la ubicación y el nombre del archivo
                          o archivos que desea mover.
  destino Especifica la nueva ubicación del archivo. Destino
                          puede consistir en una letra de unidad y dos puntos, un
                          nombre del directorio, o una combinación. Si te estas moviendo
                          solo un archivo, también puede incluir un nombre de archivo si
                          desea cambiar el nombre del archivo cuando lo mueva.
  [unidad:] [ruta] dirname1 Especifica el directorio al que desea cambiar el nombre.
  dirname2 Especifica el nuevo nombre del directorio.

  / Y Suprime las indicaciones para confirmar que desea
                          sobrescribe un archivo de destino existente.
  / -Y Provoca que se confirme que desea sobrescribir
                          un archivo de destino existente

El modificador / Y puede estar presente en la variable de entorno COPYCMD.
Esto puede anularse con / -Y en la línea de comando. El valor predeterminado es
para solicitar sobrescrituras a menos que el comando MOVE se ejecute desde
dentro de un script por lotes.

Realmente estoy buscando un cambio de nombre recursivo, lo siento, incluí el movimiento como parte de la pregunta.
javamonkey79

1

El comando XCOPY incorporado está cerca. Hará una copia recursiva, pero no creo que sea compatible con renombrar.


1
No olvide que xcopy ignorará los archivos ocultos de forma predeterminada.
Richard Harrison el

1
for /r %%x in (%1) do ren "%%x" %2

esto cambiará el nombre del archivo de forma recursiva :-)

guardar en un archivo dar 2 argumentos de extensión y extensión.

Ej: el nombre del archivo es test.bat comando: test * .avi * .bmp

renombra todos los archivos con extensión avi a bmp (en todas las subcarpetas :))

Nota: Esta es una corrección para la publicación respondida el 26 de octubre a las 13:20 por Rob Kam. Él dio por

/r %x in (*.c) do ren "%x" *.cpp

donde como debería tener %% en lugar de %


El %% es necesario solo para archivos por lotes.
Paradroid



1

He creado un script VB que buscará y reemplazará los nombres de directorio ... También tengo una versión de archivos, sin embargo, creo que esto es suficiente para que pueda comenzar con su propio script. La forma en que uso este script es que tengo un fileandreplacedirs.vbs, y lo pongo en la misma carpeta que las carpetas que quiero renombrar. Además, no necesariamente se repite en la carpeta, pero podría con una pequeña modificación

search1  = InputBox("Search for...", "", "")
replace1 = InputBox("replace with...", "", "")

Dim MyFile
MyFiles = GetFileArray(".")

For Each MyFile In MyFiles
    NewFilename = Replace(MyFile.Name, search1, replace1)
    If InStr( MyFile.Name, search1 ) Then MyFile.Name = NewFilename
Next

MsgBox "Done..."

function GetFileArray(ByVal vPath)
    'Get our objects...
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set Folder = FSO.Getfolder(vPath)
    Set Files = Folder.SubFolders

    'Resize the local array
    'Arrays are 0 based but Files collection is 1 based.
    if Files.count = 0 then
        GetFileArray = array()
        Exit Function
    Else
        Index = 0
        Redim FileList(Files.Count-1)
        For Each File In Files
            set FileList(Index) = File
            Index = Index + 1
        Next
        GetFileArray = FileList
    End If

    'Always good practice to explicitly release objects...
    Set FSO = Nothing
    Set Folder = Nothing
    Set Files = Nothing

End function

0

Use un comando simple de DOS.

  1. cd al directorio de origen donde desea cambiar el nombre de las extensiones de archivo de forma recursiva.

  2. Escriba este comando:

    ren *.[CurrentFileExtension] *.[DesiredFileExtension]
    

1
Eso funciona bien para el cwd, pero no para los subdirectorios, por lo tanto, no es recursivo. Gracias aunque :)
javamonkey79

0

Agregué if existpara evitar devoluciones de error (es importante en Jenkins para que no rompa una compilación) cuando el archivo no existe en todas las carpetas:

for /r %x in (foo) do if exist "%x" move "%x" "drive:\path\bar"

Para hacer un cambio de nombre recursivo:

for /r %x in (*.c) do if exist "%x" ren "%x" *.cpp

Ejemplo de lote:

for /r "< DIR >" %%x in (*.c) do if exist "%%x" ren "%%x" *.cpp

1
En lugar de crear una nueva respuesta, simplemente debería editar la respuesta que ha agregado.
LostBalloon

0

Powershell es tu amigo. No se necesitan archivos por lotes ni scripts. Por ejemplo, para renombrar recursivamente todos los archivos .tiff a .tif en un directorio remoto, puede ejecutar el siguiente comando desde Powershell:

get-childitem "\\\servername\d$\path" -recurse -Include *.tiff | Rename-Item -NewName { $_.Name.replace(".tiff",".tif") }


0

Encontré este script de Python que también funciona:

for root, dirs, files in os.walk(cur_dir):  
    for filename in files:  
        file_ext = os.path.splitext(filename)[1]  
        if old_ext == file_ext:  
            oldname = os.path.join(root, filename)  
            newname = oldname.replace(old_ext, new_ext)  
            os.rename(oldname, newname)

Encontrado en: http://gomputor.wordpress.com/2008/09/29/change-the-extension-of-multiple-files-in-a-chosen-directory-with-python/

Agregué Python a mi ruta y puse el script de Python arriba en una carpeta 'utils'. Luego creé este script por lotes simple para ejecutarlo: rn.bat:

python \utils\rn.py %1 %2 %3

También actualicé el script de Python anterior para tomar sus argumentos de la línea de comando. rn.py:

import sys
import os

cur_dir = sys.argv[1]
old_ext = sys.argv[2]
new_ext = sys.argv[3]

#print cur_dir, old_ext, new_ext
for root, dirs, files in os.walk(cur_dir):  
    for filename in files:  
        file_ext = os.path.splitext(filename)[1]

        if old_ext == file_ext:  
            oldname = os.path.join(root, filename)  
            newname = oldname.replace(old_ext, new_ext)  
            os.rename(oldname, newname)

Finalmente, todo lo que hay que hacer ahora es algo como esto:

>rn . .foo .bar

o

>rn \ .exe .txt

Diviértete con el segundo :)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.