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 letraS
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 letraF
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ávelcounter
do segundo caractere (porque o primeiro caractere é # 0) até o final. Então, secounter
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 decounter
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 comandodir
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 comandomove
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
.