Mesclando pastas no Windows, alterando nomes de arquivos

0

Eu estou usando o Windows 8 e eu queria saber se é possível mesclar pastas que contêm arquivos com o mesmo nome, mas em vez de substituí-los, 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 estes sendo os arquivos os mesmos que estavam nas pastas A e B, e também cuidando que a ordem seja a mesma.

sebastianhrp
fonte
Você só quer que os arquivos sejam nomeados 01, 02, 03, ... (com o A arquivos recebendo o menor n números), independentemente dos nomes dos arquivos originais? Porque pode ser mais útil a longo prazo para ir com um A-01, A-02, A-03, A-antelope, A-buffalo, A-cat, A-dog... B-01... esquema.
Scott
Não estou realmente interessado no nome do arquivo, desde que ele mantenha a ordem dos arquivos em uma ordem lexicográfica e tenha os arquivos que estavam originalmente na pasta A antes dos arquivos na pasta B.
sebastianhrp

Respostas:

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 carta S por isso, porque estes são os s diretórios de origem. 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 no '…' citações, com %%F definido para a linha. Eu escolhi a carta F por isso, porque estes são os f ile nomes.
  • dir %%S /b/a-d/one dá um b são (sem cabeçalho, datas, tamanhos, etc.) dos arquivos no diretório de origem %%S. /a-d significa listar apenas arquivos (sem diretórios); /one significa o order (sort) as entradas por n ame e e extensão.
  • set /a counter=counter+1 é autoexplicativo.
  • Então, finalmente, nós executamos um move comando, mover o arquivo ( %%F ) a partir do diretório de origem ( %%S ) para o diretório de destino. !counter:~1! é uma forma do % variável : ~ começar , comprimento % sintaxe, tomando a substring do counter variável do segundo caractere (porque o primeiro caractere é # 0) até o final. Então se counter está 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 %%F nome do arquivo.

Isso move todos os arquivos no a e b diretórios. Se você quiser ter tudo no a e b árvores de diretórios, 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"
        )
  • Adicionando /s ao dir comando torna recursivo.
  • Enquanto dir directory_name / b dá apenas nomes de arquivos, dir directory_name / b / s dá-lhe caminhos completos então o move comando não precisa incluir o %%S diretório de origem.

Mais notas:

  • Isso manipulará nomes de arquivos com espaços neles.
  • Isso manipulará nomes de diretórios com espaços neles - apenas os cite:

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

Claro que você deve testar isso primeiro com move mudou para echo move.

Scott
fonte