Como renomear várias pastas enquanto mantém seus subdiretórios de arquivos

0

Eu quero renomear várias pastas e manter todos os arquivos e subdiretórios intactos.
Comandos em lote do Windows, como xcopy e move , não suportam todos os casos * .

Eu configurei duas colunas com caminhos antigos e novos caminhos.

OLD PATH            NEW PATH
C:\dir1\dir3\dir7   C:\a1\a2\a3      
C:\dir1\dir4\dir8   C:\b1\b2\b3      
C:\dir2\dir5\dir9   C:\c1\c2\c3      
...
C:\dir2\dir6\dir0   C:\d1\d2\d3      

Dificuldades: mais de uma pasta por linha precisa ser renomeada; As últimas pastas listadas como dir7 podem ter vários subdiretórios; carimbos de hora de arquivo não devem ser modificados

* xcopy não pode se mover, apenas copia. Isso é um problema se você não tiver espaço suficiente para copiar e excluir big data. O comando move não move subdiretórios, apenas arquivos

    
por nixda 20.11.2013 / 21:55

1 resposta

1

A versão mais simples (simples) do arquivo batch seria assim:

call :robo "C:\dir1\dir3\dir7"   "C:\a1\a2\a3"
call :robo "C:\dir1\dir4\dir8"   "C:\b1\b2\b3"
call :robo "C:\dir2\dir5\dir9"   "C:\c1\c2\c3"
echo etc...
call :robo "C:\dir2\dir6\dir0"   "C:\d1\d2\d3"
goto:eof

:robo
robocopy %1 %2 /MOVE /E
goto:eof

Você precisaria citar os diretórios caso eles tenham espaços.

Para ler os diretórios de um arquivo, você faria isso:

directories.txt :

C:\dir1\dir3\dir7,C:\a1\a2\a3
C:\dir1\dir4\dir8,C:\b1\b2\b3
C:\dir2\dir5\dir9,C:\c1\c2\c3
C:\dir2\dir6\dir0,C:\d1\d2\d3

Não há necessidade de citações e separá-las com uma vírgula. Então no batchfile:

FOR /F "tokens=1-2* delims=," %%A IN (directories.txt) DO (
  robocopy "%%A" "%%B" /MOVE /E
)

Também aqui ... se você gostaria de ver qual robocopy usa primeiro o /L .

Se você tiver um arquivo como este (com espaços para alinhar a primeira e a segunda coluna), será necessário adicionar algum código para remover os espaços iniciais e finais dos diretórios:

Novamente, o directories.txt :

C:\dir1\dir3\dir7\sada\asda ,  C:\a1\a2\a3
C:\dir1\dir4\dir8           ,  C:\b1\b2\b3
C:\dir2\dir5\dir9           ,  C:\c1\c2\c3
...
C:\dir2\dir6\dir0           , C:\d1\d2\d3

E isso como batchfile:

@echo off
setlocal enabledelayedexpansion
FOR /F "tokens=1-2* delims=," %%A IN (directories.txt) DO (
  call :trim dir1 %%A
  call :trim dir2 %%B
  robocopy "!dir1!" "!dir2!" /MOVE /E
)
goto:eof

:trim
set trimmed=%2
for /f "tokens=* delims= " %%c in ("%trimmed%") do set trimmed=%%c
for /l %%c in (1,1,100) do if "!trimmed:~-1!"==" " set trimmed=!trimmed:~0,-1!
set "%~1=%trimmed%"
goto:eof

Nota: Nenhuma verificação de erro é feita para ver se os diretórios realmente existem ou se apenas uma coluna é preenchida ... etc ...
(mas é claro que isso poderia ser adicionado).

    
por 21.11.2013 / 01:05