Ir ao conteúdo

Bat Script *.bat para mover 10000 arquivos


Ir à solução Resolvido por ricardo_br,

Posts recomendados

Postado

Olá, boa noite!

Estou com uma demanda e não estou conseguindo resolver.

 

Tenho diferentes pastas com números de arquivos variados em cada uma delas. Por exemplo, tenho uma pasta com 240 mil arquivos e gostaria de criar um script no CMD para distribuir 10 mil destes arquivos em diferentes pastas.

 

Alguém poderia ajudar?

Muito obrigado! 

Postado

@ricardo_br claro!

O que tenho é uma pasta (pasta_ligantes) com diferentes subpastas (pasta_ca até pasta_ch) e em cada subpastas um número variado de arquivos no mesmo formato (*.pdbqt).

Por exemplo:

 

pasta_ligantes

    pasta_ca

       arquivo_ca1.pdbqt

       arquivo_ca2.pdbqt

       ...

       arquivo_ca87639.pdbqt

   pasta_cb

        arquivo_cb1.pdbqt

        arquivo_cb2.pdbqt

        ...

        arquivo_cb239485.pdbqt

    pasta_cc

        arquivo_cc1.pdbqt

        arquivo_cc2.pdbqt

        ...

        arquivo_cc92385.pdbqt

   ...

   pasta_ch

        arquivo_ch1.pdbqt

        arquivo_ch2.pdbqt

        ...

        arquivo_ch153947.pdbqt

 

 

O que eu quero fazer é:

pasta_ligantes

    pasta_ca

        pasta_ca_1

           arquivo_ca1.pdbqt até arquivo_ca10000

        pasta_ca_2 

             arquivo_ca10001.pdbqt até arquivo_ca20000

       ...

       Depois do 20001 até 30000

etc

 Ou seja, quero mover 10 mil destes arquivos e colocá-los em diferentes subpastas.

   

 

Seria possível?

Postado

@InacioJDAh agora ficou mais claro. Acredito que sim. 

Os arquivos e pastas tem o mesmo nome como no exemplo ou isso é apenas um exemplo mesmo?

Teria que usar um For e um contador para que sempre que chegasse a 10.000 criasse uma nova pasta e movesse os arquivos para essa nova pasta.

Postado
set /a folder_count=1
set /a files_per_folder=10000

forfiles /p "C:\caminho\para\pasta\de\origem" /m * /c "cmd /c if @isdir==FALSE if @fsize gtr 0 move @path "C:\caminho\para\pasta\de\destino"\Folder_!folder_count! & set /a folder_count+=((@filecount+1) %% %files_per_folder%)"

 

tentei fazer aqui, não tenho 10% da experiência em batch do ricardo_br mas talvez ajude. com preguiça de fazer pastas pasta teste, não pude testar o código.

  • Curtir 1
Postado
1 hora atrás, ricardo_br disse:

@Swalls Na verdade acho que ele tem milhões de arquivos que ele quer dividir em 10.000 arquivos cada subpasta.

Exatamente isso, mas não seriam milhões de arquivos, o máximo é uma pasta que contém aproximadamente 250 mil arquivos.

 

Mas eu nem me importaria em criar as pastas individualmente, até porque eu vou trabalhar em cada uma separadamente, não seria nenhum problema.

 

No caso, a minha maior limitação seria no comando para mover 10000 arquivos com uma linha de comando. Eu tentei fazer selecionando, recortando e colando, mas o explorer trava com frequência e dificulta o processo.

Postado

Eu estou quase conseguindo só tenho dificuldade em salvar de 1 até 10000 porque o windows usa a calssificação lógica e o prompt de comando usa a classificação númerica....

 

 

 

  • Curtir 1
  • Solução
Postado

@Swalls No phyton da para fazer tudo isso em uma linha ou apenas a parte de usar classificação lógica?

Sabe informar se arquivos.exe feitos em phyton rodam sem ter que baixar nada ou tem que baixar alguma biblioteca?

Eu consegui solucionar o problema da classificação numérica usando powershell dentro do bat.

 

https://pastebin.com/raw/juMzEmFt

 

@echo off

:: Defina aqui a pasta base:
set PastaB=%userprofile%\desktop\pasta_ligantes

:: Defina aqui o limite para que deva ocorrer a divisão entre as pastas:
set Limite=10000

for /f "delims=" %%a in ('dir /b /ad "%PastaB%\*.*"') do For /f "delims=" %%b in ('dir /b /a-d "%PastaB%\%%a" ^|find /c /v ""') do if %%b GEQ %Limite% (
                                                                                                                                                        set ContadorPasta=1
                                                                                                                                                        set ContadorArquivo=1
                                                                                                                                                        md "%PastaB%\%%a\%%~a_1"
                                                                                                                                                        for /f "delims=" %%c in ('"powershell get-childitem \"%PastaB%\%%a\" -File^|Sort-Object { [regex]::Replace($_.Name, \"\d+\", { $args[0].Value.PadLeft(20) }) } ^|foreach{$_.Name}"') do call :Separar "%%~a" "%%~b" "%%~c"
                                                                                                                                                       )                                                    

pause
exit
:: a = Subpasta dentro de Pasta Base
:: b = quantidade
:: c = arquivo

:Separar
move "%PastaB%\%~1\%~3" "%PastaB%\%~1\%~1_%ContadorPasta%\%~3"
if %ContadorArquivo% GEQ %Limite% (
                                   set ContadorArquivo=1
                                   set /a ContadorPasta+=1
                                   call md "%PastaB%\%~1\%~1_%%ContadorPasta%%"
                                  ) else (
                                          set /a ContadorArquivo+=1
                                         )
goto :EOF

 

  • Curtir 2
Postado

@ricardo_br há 2 tipos de arquivos .exe feito em python.

 

O feito com pyinstaller ou autopy2exe, esse executável é um arquivo "bem grande", pois ele é um "falso executável", ele meio que junta o compilador do python com suas dependências em um único arquivo .exe

o feito em pyinstaller é menor e mais otimizado(se souber usar) do que o feito pelo autopy2exe, que te dá uma interface no code.

o feito de python para C e posteriormente compilado, que é realmente um .exe, mas extremamente complexo de fazer.

 

Nativamente o python não foi feito para criar arquivos executáveis, afinal, assim como o java, ele é um interpretador(a linha é passada para bytecode, código de máquina, compilada e executada.)

O arquivo de bytecode do python .pyc(executado pela PVM - Python Virtual Machine) é equivalente ao .class(executado pela JVM) do java, e você pode executa-lo diretamente com a VM assim como no java.

ps: sei praticamente a base bem básica de java e não uso a anos, então essa comparação é bem superficial.

 

Sim, no python é possível fazer tudo isso em uma única linha de código.

  • Curtir 2
Postado

@ricardo_br primeiramente, me perdoe a demora em dar um retorno. tive algumas demandas urgentes aqui no trabalho que me tiraram do foco do que seria mais importante.

 

eu fiz conforme o script que voce indicou, e até o momento está funcionando perfeitamente! muito obrigado mesmo.

 

a respeito da ordem dos arquivos, para mim não importa a forma que os arquivos serao ordenados. o que eu preciso é apenas distribuir os arquivos para deixar o programa de análise que utilizo mais leve e com menos chances de travar.

 

se surgir qualquer intercorrência volto aqui para buscar ajuda ou então para dar um parecer final e te agradecer imensamente pelo seu auxílio.

 

mas desde já, muito obrigado pela sua ajuda!

 

image.thumb.png.ea20d83e488e07fb1a17dbda0584b027.png

obrigado!

Em 29/06/2023 às 19:29, Swalls disse:

@InacioJD tem python na sua maquina? se tiver faço um script aqui que resolve isso em 1 linha.

@Swalls sim, tenho python.

não tenho muita intimidade com esta linguagem. utilizei algumas poucas vezes.

 

a solucao do @ricardo_br está funcionando bem até o momento (como sao milhares de arquivos o *.bat ainda não terminou de rodar).

 

se importaria em passar como seria em python? gostaria de aprender como seria também.

Postado

@ricardo_br ficou perfeito!

Sou um grande admirador do seu conhecimento. Aprendi demais com o que você tem compartilhado aqui no fórum. 

Muito obrigado por toda a sua contribuição.

10 horas atrás, InacioJD disse:

@ricardo_br primeiramente, me perdoe a demora em dar um retorno. tive algumas demandas urgentes aqui no trabalho que me tiraram do foco do que seria mais importante.

 

eu fiz conforme o script que voce indicou, e até o momento está funcionando perfeitamente! muito obrigado mesmo.

 

a respeito da ordem dos arquivos, para mim não importa a forma que os arquivos serao ordenados. o que eu preciso é apenas distribuir os arquivos para deixar o programa de análise que utilizo mais leve e com menos chances de travar.

 

se surgir qualquer intercorrência volto aqui para buscar ajuda ou então para dar um parecer final e te agradecer imensamente pelo seu auxílio.

 

mas desde já, muito obrigado pela sua ajuda!

 

image.thumb.png.ea20d83e488e07fb1a17dbda0584b027.png

obrigado!

@Swalls sim, tenho python.

não tenho muita intimidade com esta linguagem. utilizei algumas poucas vezes.

 

a solucao do @ricardo_br está funcionando bem até o momento (como sao milhares de arquivos o *.bat ainda não terminou de rodar).

 

se importaria em passar como seria em python? gostaria de aprender como seria também.

 

  • Curtir 1
Postado
Em 04/07/2023 às 12:09, InacioJD disse:

 

se importaria em passar como seria em python? gostaria de aprender como seria também.

@InacioJD Claro, com todo prazer.
aqui está:
 

from os import makedirs,scandir as scan
from shutil import move


dir = "./pasta"


it = scan(dir)


[makedirs(f"{dir}/p{n//10000}",exist_ok=True) or move(x.path,f"{dir}/p{n//10000}/") for n,x in enumerate(it) if x.is_file]

 

explicações:

  • dir é a variável que você vai por o caminho da sua pasta.
  • Os e shutil são bibliotecas padrões do python, não precisa instalar.
  • it é um iterator, o método scandir da biblioteca OS permite cria um iterator que retorna objetos "DirEntry".
  • makedirs é semelhante ao mkdir do shell, mas tem um parâmetro exist_ok, que lhe permite não levantar uma except caso já exista a pasta.
  • motivo do it estar fora da linha: lhe permite usar threads sem ter que abrir outro scan e assim passar vários arquivos por vez. (nesse caso eu não abri threads para não ficar complexo e pode ser perigoso se n souber usar)
  • // fora de string significa divisão inteira, ou seja, só vai mudar e trocar pasta de destino ao ultrapassar 10000 arquivos.
  • move é para mover arquivos
  • enumerate faz com que um "vetor" seja enumerado e retorna 2 valores, seu numero e seu conteúdo.
  • if x.is_file faz com que ele manipule apenas arquivos e não mova pastas.
  • loucura que notei no código: se por um milagre da criação, sua pasta ultrapassar 10 mil pastas com 10 mil arquivos cada, ele vai criar uma nova pasta, por essas 10 mil dentro e começar outra pasta ao lado.
  • or é um operador lógico OU, como funções "sem retorno" retornam none, ele toma um como false e acaba por executar 2 funções.

Lembrando que, por ser uma aplicação única, o codigo todo inline é aplicável, mas não seria correto fazer isso se fosse um modulo ou projeto.

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!