Mesclar pastas no Windows, alterando nomes de arquivos

0

Estou usando o Windows 8 e queria saber se é possível mesclar pastas que contenham arquivos com o mesmo nome, mas em vez de sobrescrevê-las, alterando o nome.

Por exemplo:

Folder A, with files 01, 02, and 03  
Folder B, with files 01, 02, and 03

Eu quero que o resultado seja

Folder C (or any name) with:
   Files 01(A01), 02(A02), 03(A03), 04(B01), 05(B02) and 06(B03)

Todos esses arquivos são os mesmos que estavam nas pastas A e B, e também cuidando para que o pedido seja o mesmo.

    
por sebastianhrp 07.08.2014 / 19:05

1 resposta

0

Use o seguinte script (arquivo em lotes):

@echo off
setlocal enabledelayedexpansion

set counter=1000

set target=c

for %%S in (a b) do (
        for /f "delims=" %%F in ('dir %%S /b/a-d/one') do (
                set /a counter=counter+1
                move %%S\"%%F" %target%\"%%~xF"
        )
)

Notas:

  • setlocal enabledelayedexpansion permite o tratamento especial de variáveis em loops.
  • for %%S in (a b) do … executa o seguinte grupo de instruções uma vez para cada valor entre parênteses, com %%S definido para o valor. Eu escolhi a letra S para isso porque esses são os diretórios s ource. Você pode colocar tantos diretórios de origem entre parênteses quanto desejar.
  • for /f "delims=" %%F in ('…') do … executa o seguinte grupo de instruções uma vez para cada linha de saída do comando nas '…' quotes com %%F definido para a linha. Eu escolhi a letra F para isso porque esses são os nomes de f ile.
  • dir %%S /b/a-d/one dá a b são (sem cabeçalho, datas, tamanhos, etc.) dos arquivos no diretório de origem %%S . /a-d significa somente arquivos de lista (sem diretórios); /one significa o rder (sort) as entradas pela extensão n ame e e .
  • set /a counter=counter+1 é autoexplicativo.
  • Então, finalmente, executamos um comando move , movendo o arquivo ( %%F ) do diretório de origem ( %%S ) para o diretório de destino. !counter:~1! é uma forma do sintaxe %variable:~start,length% , pegando a substring da variável counter do segundo caractere (porque o primeiro caractere é # 0) até o final. Então, se counter estiver percorrendo os valores 1001, 1002, 1003,…, então esta subseqüência é 001, 002, 003 etc. Se tiver certeza de que você tem menos de 100 arquivos, você pode alterar a inicialização de counter para 100. E %%~xF é a extensão do nome do arquivo %%F .

Isso move todos os arquivos nos diretórios a e b . Se você deseja obter tudo nas árvores de diretório a e b , altere o loop interno para

        for /f "delims=" %%F in ('dir %%S /b/a-d/one/s') do (
                set /a counter=counter+1
                move "%%F" %target%\"!counter:~1!%%~xF"
        )
  • Adicionar /s ao comando dir faz com que seja recursivo.
  • Enquanto dir directory_name /b fornece apenas nomes de arquivo, dir directory_name /b/s te dá caminhos completos por isso, o comando move não precisa incluir o diretório %%S source.

Mais notas:

  • Isso manipulará nomes de arquivos com espaços neles.
  • Isso manipulará nomes de diretórios com espaços neles. Basta citar:

    set target="c food"
    
    for %%S in ("a train" "b good") do (
                    ︙
    

É claro que você deve testar isso primeiro com move alterado para echo move .

    
por 16.08.2014 / 03:46