Mover arquivos para uma pasta com base no nome deles

1

Eu tenho vários arquivos .pdf e .jpg que preciso mover.

Eles são nomeados algo assim

002-054*.pdf
042-021*.pdf

* sendo algum afixo.

Agora quero mover esses arquivos para pastas como esta

002
@echo off
for %%F in (*.pdf *.jpg) do call :subr "%%F"
exit /b

:subr
set filename=%1
move %1 %filename:~1,3%\%filename:~1,7%\
exit /b
2 - 054
002-054*.pdf
042-021*.pdf
2-054*.pdf 0422 - 0212-021*.pdf

Algumas pastas já existem, mas neste esquema de nomenclatura 002%code%2 - 054 Some Name\

Eu só quero criar as pastas conforme indicado no segundo snippet de código, quando elas ainda não existem. Se eles já existirem, eu só quero mover os arquivos para a pasta correspondente.

Através de algumas pesquisas eu pude colocar algo em conjunto

002
@echo off
for %%F in (*.pdf *.jpg) do call :subr "%%F"
exit /b

:subr
set filename=%1
move %1 %filename:~1,3%\%filename:~1,7%\
exit /b
2 - 054%pre%2-054*.pdf 0422 - 0212-021*.pdf

Mas isso não considera as pastas que já existem. Qual seria a melhor maneira de conseguir isso?

    
por Dan 24.04.2018 / 12:21

2 respostas

2

Você só precisa adicionar algumas linhas à sub-rotina: -

:subr
set filename=%1
Rem Check for existence of directories in target path
if not exist %filename:~1,3% md %filename:~1,3%
if not exist %filename:~1,3%\%filename:~1,7% md %filename:~1,3%\%filename:~1,7%
Rem Now the move can proceed
move %1 %filename:~1,3%\%filename:~1,7%\
exit /b

Isso falhará se houver um arquivo existente com o mesmo nome de um dos caminhos de diretório que você precisa criar. Você precisará decidir como lidar com esse caso, adicionando uma extensão ao nome ou movendo o arquivo para outro lugar.

    
por 24.04.2018 / 12:58
0

desde que a pasta tenha que ser criada no diretório atual | e a pasta de 2º nível tem - entre os números:

@echo off
for /f "delims=" %%F in (
  'Dir /b *.pdf *.jpg^|findstr "^[0-9][0-9][0-9]-[0-9][0-9][0-9]" '
) do call :subr "%%F"
exit /b

:subr
set "file=%~n1"
set "fold=%file:~0,3%\%file:~0,3% - %file:~4,3%\"
if not exist "%fold%" md "%fold%"
move %1 "%fold%"

As alterações para e dir |findstr devem ser feitas apenas com arquivos que começam com o padrão numérico 999-999. Como o md cria pastas intermediárias, apenas um md é necessário.

    
por 24.04.2018 / 15:05