Que comando posso usar para renomear recursivamente ou mover um arquivo no Windows?

38

Qual comando no Windows emula o comando recursive move / rename do Unix?

    
por javamonkey79 16.10.2008 / 23:42

12 respostas

54

Use o comando for do XP. Por exemplo, a partir da linha de comando (em um arquivo de lote, use %%x ) para executar um movimento recursivo:

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

Para fazer uma renomeação recursiva, faça o seguinte:

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

Exemplo de lote:

for /r "< DIR >" %%x in (*.c) do ren "%%x" *.cpp
    
por 26.10.2008 / 14:20
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).
    
por 31.10.2012 / 17:42
2

Eu apenas corro um pequeno exemplo na minha caixa do Windows XP SP2 com o comando move e funcionou. Todos os arquivos e diretórios foram movidos da origem para o destino. source e dest são nomes de diretórios.

move source dest
ver

Microsoft Windows XP [Version 5.1.2600]
move /?

Moves files and renames files and directories.

To move one or more files:
MOVE [/Y | /-Y] [drive:][path]filename1[,...] destination

To rename a directory:
MOVE [/Y | /-Y] [drive:][path]dirname1 dirname2

  [drive:][path]filename1 Specifies the location and name of the file
                          or files you want to move.
  destination             Specifies the new location of the file. Destination
                          can consist of a drive letter and colon, a
                          directory name, or a combination. If you are moving
                          only one file, you can also include a filename if
                          you want to rename the file when you move it.
  [drive:][path]dirname1  Specifies the directory you want to rename.
  dirname2                Specifies the new name of the directory.

  /Y                      Suppresses prompting to confirm you want to
                          overwrite an existing destination file.
  /-Y                     Causes prompting to confirm you want to overwrite
                          an existing destination file.

The switch /Y may be present in the COPYCMD environment variable.
This may be overridden with /-Y on the command line.  Default is
to prompt on overwrites unless MOVE command is being executed from
within a batch script.
    
por 16.10.2008 / 23:56
1

O comando interno XCOPY está fechado. Ele fará uma cópia recursiva, mas eu não acho que ele suporta renomear.

    
por 16.10.2008 / 23:49
1
for /r %%x in (%1) do ren "%%x" %2

isto renomeia o arquivo recursivamente: -)

salve em um arquivo dê 2 argumentos de extensão e extensão.

ex: nome do arquivo é test.bat comando: test * .avi * .bmp

renomeia todos os arquivos com extensão avi para bmp (em todas as subpastas :))

Nota: Esta é uma correção para o post respondido 26 de outubro às 13:20 por Rob Kam. Ele deu por

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

onde o shud tem %% em vez de %

    
por 27.01.2009 / 13:16
1

Isso funcionou melhor para mim:

FOR /R "C:\folder1\folder2\" %i in (.,*) DO MOVE /Y "%i" "C:\folder1\"

Fonte: link

    
por 30.01.2009 / 10:18
1

Existem portas do Windows para a maioria dos comandos do UNIX:

por 06.08.2009 / 21:48
1

Eu criei um VB Script que fará uma pesquisa e substituirá nomes de diretórios ... Eu também tenho uma versão de arquivos, no entanto, acho que isso é suficiente para você começar com seu próprio script. A maneira como eu uso esse script é que tenho um fileandreplacedirs.vbs e o coloco na mesma pasta que as pastas que desejo renomear. Além disso, não necessariamente recursão na pasta, mas poderia com uma pequena modificação

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
    
por 17.10.2008 / 00:05
0

Use um simples comando DOS.

  1. cd para o diretório de origem em que você deseja renomear as extensões de arquivo de forma recursiva.

  2. Digite este comando:

    ren *.[CurrentFileExtension] *.[DesiredFileExtension]
    
por 17.10.2008 / 15:21
0

Eu adicionei if exist para evitar retornos de erros (isso é importante no Jenkins para não quebrar uma compilação) quando o arquivo não existe em todas as pastas:

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

Para fazer uma renomeação recursiva, faça o seguinte:

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

Exemplo de lote:

for /r "< DIR >" %%x in (*.c) do if exist "%%x" ren "%%x" *.cpp
    
por 07.11.2013 / 20:46
0

Powershell é seu amigo. Não há arquivos em lote ou scripts necessários. Por exemplo, para renomear recursivamente todos os arquivos .tiff para .tif em um diretório remoto, você pode executar o seguinte comando a partir do Powershell:

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

    
por 07.05.2014 / 19:55
0

Eu encontrei este script python que também 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 em: link

Eu adicionei o Python ao meu caminho e coloquei o script Python acima em uma pasta 'utils'. Eu então criei este script em lote simples para executá-lo: rn.bat:

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

Eu também atualizei o script python acima para pegar seus args a partir da linha 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, tudo que precisamos fazer agora é algo assim:

>rn . .foo .bar

ou

>rn \ .exe .txt

Divirta-se com o segundo:)

    
por 17.10.2008 / 02:12