Mover arquivos datados para suas pastas datadas correspondentes

3

Eu tenho arquivos .pdf com a data no final do nome, por exemplo "BINNAWAY - WERRIS CK - 483,94 - 120612".

Eu tenho pastas com o nome das datas de cada um desses arquivos, por exemplo, "12-06-2012".

Como posso mover todos os arquivos para as pastas correspondentes com base na data em seu nome?

Estou no Windows XP.

Agradecemos qualquer conselho.

Obrigado

    
por Michael 21.03.2014 / 06:36

3 respostas

1

@ e31415 Seu código trabalhou em alguns dos arquivos. Mas há muitos outros em que não funcionou porque todos os arquivos não estão no formato <name1> - <name2> - <some numbers> - <date> , como assumido. Alguns podem estar no formato <name1> - <some numbers> - <date> ou algo mais diferente. No entanto, todos os arquivos terminarão com - <date> , nos seguintes arranjos possíveis: "- 120612", "- 120612 (1)", "- 120612 (2)" ou "- No Date". Como posso fazer com que apenas o texto após o último hífen seja considerado?

Aprecie toda a sua ajuda.

Michael

    
por 27.03.2014 / 07:01
0

Olá, só pensei em atualizar o progresso que fiz e fornecer algum feedback para minhas próprias perguntas. Para contabilizar os arquivos com o formato de nomenclatura <name1> - <some numbers> - <date> em vez de <name1> - <name2> - <some numbers> - <date> , conforme assumido por @ e 31415 no script que ele forneceu, acabei de alterar tokens=4 para tokens=3 em um novo arquivo .cmd. Isso funcionou. Ainda assim, muitos arquivos não foram processados por esses scripts em lote. Eu descobri que o script estava apenas processando alguns dos arquivos na pasta (ele processava apenas 50 a 100 arquivos pdf e eu tenho milhares de arquivos pdf para passar), então eu criei uma nova pasta e joguei o excesso de pdfs lá dentro. e executei os scripts em lote lá. Ainda muitos arquivos pdf não processados, mas estou passando por eles processando 50-100 pdfs cada um em uma nova pasta e isso deve ser feito rapidamente. Não ideal, mas ainda muito melhor do que fazê-lo manualmente, um por um! Obrigado pela vossa ajuda @ and31415:)

    
por 02.04.2014 / 06:12
0

O script em lote a seguir pressupõe que:

  • Todos os nomes de arquivos estão no formato <name> - [...] - <some numbers> - <date> .
  • Todos os anos estão no intervalo 2000-2099 .

Basta copiar e colar o código em um novo arquivo de texto e salvá-lo como MoveFiles.cmd (ou o que for, contanto que você mantenha o .cmd extensão ).

@echo off
setlocal
setlocal enabledelayedexpansion

for /r %%A in (*.pdf) do (
set date=
call :getLastToken "%%~nA"
for /f "tokens=1" %%B in ("!last!") do set date=%%~B
echo "!date!"|findstr "^\"[0-3][0-9][0-1][0-9]*\"$" >nul
if !errorlevel! == 0 (
set targetFolder=!date:~0,2!-!date:~2,2!-20!date:~4,2!
if not exist "!targetFolder!\" md "!targetFolder!"
move "%%~fA" "!targetFolder!" >nul
))

endlocal & exit /b

:getLastToken
set "str=%~1"
:loop
for /f "tokens=1* delims=-" %%A in ("%str%") do (
set "last=%%A"
set "str=%%B"
)
if defined str goto :loop
exit /b

Como funciona

  1. Lista todos os arquivos .pdf na pasta atual.

  2. Pegue cada nome de arquivo e tokenize .

  3. Verifique se os caracteres recuperados são na verdade números:

    A variável é ecoada e depois canalizada para o comando findstr , que usará um expressão regular para corresponder aos caracteres alfabéticos.

    • ^ corresponde ao início da linha;
    • \" corresponde a um caractere de aspas diretas ( " );
    • [0-9] define uma classe de caracteres que corresponde a qualquer caractere de 0 a 9;
    • * repete zero ou mais ocorrências da classe anterior;
    • $ corresponde ao fim da linha.

    Além disso, a expressão regular tentará corresponder o máximo possível de datas válidas. A variável !errorlevel! será definida como 0 se houver uma correspondência ou 1 caso contrário. A saída findstr será então redirecionada para nul , portanto, ignorada.

  4. Crie a pasta de destino, caso ainda não exista.

  5. Mova o arquivo atual para a pasta relacionada.

Leitura adicional

  • Referência da linha de comando
por 21.03.2014 / 11:34

Tags