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

40

Que comando no Windows emula o comando recursivo mover / renomear do Unix?

javamonkey79
fonte

Respostas:

56

Use o forcomando do XP . Por exemplo, na linha de comando (em %%xvez disso, use um arquivo em lotes ) para executar uma movimentação recursiva:

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

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

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

Lote de exemplo:

for /r "< DIR >" %%x in (*.c) do ren "%%x" *.cpp
Rob Kam
fonte
Esta é de longe a solução mais simples, muito obrigado!
Javaonkey79 /
Para usar o comando FOR em um programa em lote, especifique %% variável em vez de% variável.
Tom Robinson
Como você faz isso em um diretório de origem diferente, sem cwd'ing?
Evan Carroll
Estou tentando usar isso para substituir todos os arquivos '% 20' em todos os arquivos por um simples ''. Como eu faço isso?
Mike Warren
@RobKam, na verdade, eu vou para o loop for funcionar, mas renomeia apenas um arquivo .. como faço para definir o curinga para reconhecer que várias extensões de arquivo *.*funcionarão?
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).
Lance Miller
fonte
2

Acabei de executar 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ório.

mover origem dest
ver

Microsoft Windows XP [Versão 5.1.2600]
mover /?

Move arquivos e renomeia arquivos e diretórios.

Para mover um ou mais arquivos:
MOVER [/ Y | / -Y] [drive:] [caminho] filename1 [, ...] destino

Para renomear um diretório:
MOVER [/ Y | / -Y] [drive:] [caminho] dirname1 dirname2

  [drive:] [path] filename1 Especifica o local e o nome do arquivo
                          ou arquivos que você deseja mover.
  destino Especifica o novo local do arquivo. Destino
                          pode consistir em uma letra de unidade e dois pontos, um
                          nome do diretório ou uma combinação. Se você estiver se movendo
                          apenas um arquivo, você também pode incluir um nome de arquivo se
                          você deseja renomear o arquivo ao movê-lo.
  [drive:] [caminho] dirname1 Especifica o diretório que você deseja renomear.
  dirname2 Especifica o novo nome do diretório.

  / Y Suprime a solicitação para confirmar que você deseja
                          sobrescreva um arquivo de destino existente.
  / -Y Faz com que o prompt confirme que você deseja substituir
                          um arquivo de destino existente.

A opção / Y pode estar presente na variável de ambiente COPYCMD.
Isso pode ser substituído por / -Y na linha de comando. O padrão é
solicitar sobrescrições, a menos que o comando MOVE esteja sendo executado a partir de
dentro de um script em lote.
Jorge Ferreira
fonte
Estou realmente procurando por renomeação recursiva, desculpe-me por incluir a mudança como parte da pergunta.
Javaonkey79
1

O comando XCOPY embutido está fechado. Ele fará uma cópia recursiva, mas não acho que seja compatível com renomeação.


fonte
11
não esqueça que o xcopy ignorará os arquivos ocultos por padrão.
Richard Harrison
1
for /r %%x in (%1) do ren "%%x" %2

isso renomeará o arquivo recursivamente :-)

salvar em um arquivo forneça 2 argumentos de extensão e de 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: Isso é correção para o post respondido em 26 de outubro às 13:20 por Rob Kam. Ele deu por

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

onde, como ele tem, %% em vez de %


fonte
O %% é necessário apenas para arquivos em lote.
Paradroid 30/10/10
1

Eu criei um script VB que fará uma pesquisa e substituirá os nomes de diretório ... Eu também tenho uma versão de arquivos, no entanto, acho que isso é suficiente para você começar com seu próprio script. O jeito que eu uso esse script é eu tenho um fileandreplacedirs.vbse coloco na mesma pasta que as pastas que quero renomear. Além disso, ele não é necessariamente recursivo para a 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
Roy Rico
fonte
0

Use um comando simples do DOS.

  1. cd para o diretório de origem em que deseja renomear as extensões de arquivo recursivamente.

  2. Digite este comando:

    ren *.[CurrentFileExtension] *.[DesiredFileExtension]
    
Gaff
fonte
11
Isso funciona bem para o cwd, mas não para os subdiretórios, portanto, não é recursivo. Obrigado embora :)
javamonkey79
0

Eu adicionei if existpara evitar retornos de erro (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:

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

Lote de exemplo:

for /r "< DIR >" %%x in (*.c) do if exist "%%x" ren "%%x" *.cpp
Akira Yamamoto
fonte
11
Em vez de criar uma nova resposta, você realmente deve simplesmente editar a resposta à qual adicionou.
precisa saber é o seguinte
0

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

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

Reba
fonte
0

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: http://gomputor.wordpress.com/2008/09/29/change-the-extension-of-multiple-files-in-a-chosen-directory-with-python/

Adicionei Python ao meu caminho e coloquei o script Python acima em uma pasta 'utils'. Criei esse script em lote simples para executá-lo: rn.bat:

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

Também atualizei o script python acima para obter seus argumentos 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 o que precisamos fazer agora é algo como isto:

>rn . .foo .bar

ou

>rn \ .exe .txt

Divirta-se com o segundo :)

javamonkey79
fonte