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 enabledelayedexpansionpermite 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%%Sdefinido para o valor. Eu escolhi a letraSpara 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%%Fdefinido para a linha. Eu escolhi a letraFpara isso porque esses são os nomes de f ile. -
dir %%S /b/a-d/onedá a b são (sem cabeçalho, datas, tamanhos, etc.) dos arquivos no diretório de origem%%S./a-dsignifica somente arquivos de lista (sem diretórios);/onesignifica 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ávelcounterdo segundo caractere (porque o primeiro caractere é # 0) até o final. Então, secounterestiver 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 decounterpara 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
/sao comandodirfaz com que seja recursivo. - Enquanto
dir directory_name /bfornece apenas nomes de arquivo,dir directory_name /b/ste dá caminhos completos por isso, o comandomovenão precisa incluir o diretório%%Ssource.
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 .