Mover todos os arquivos dentro de subpastas para a pasta pai

0
Em primeiro lugar, eu estou ciente de que há toneladas de perguntas semelhantes, e eu sei, porque eu devo ter tentado adaptar pelo menos 5 delas, mas eu ainda estou aqui perguntando porque meu conhecimento ruim do CMD (que eu realmente pensei estava ficando bom até esse ponto) está me frustrando com erros genéricos e inúteis, e não consigo entender qual parte da sintaxe está errada. Isso é provavelmente devido ao fato de que outras questões lidam com as estruturas de pasta / nome de arquivo de seus respectivos OPs, e quando eu tento adaptar o código à minha própria estrutura de pastas / arquivos ele se recusa a funcionar. Portanto, estou aqui solicitando uma solução CMD for loop que funcionará na minha própria estrutura de arquivos e pastas.

Eu tenho uma pasta pai que contém muitas outras pastas, nas quais existem arquivos:

Parent Folder
     Subfolder
           File1
           File2
     Subfolder
           File1
           File2
     Subfolder
           File1
           File2

... e assim por diante.

Estou desejando usar um loop CMD for em combinação com o comando move para extrair todos os arquivos nas subpastas para a pasta pai, deixando cada subpasta vazia.

Ao dar o loop CMD for , por favor, faça o que cada parte do comando está fazendo, pois isso ajudará a entender o código e, esperamos, minimizará o problema que tenho para que ele funcione sozinho.

    
por Hashim 17.11.2016 / 03:04

1 resposta

2

Ok, finalmente descobri adaptando o código de outra pergunta. Obrigado ao @AFH por esclarecer as partes que eu não tinha certeza sobre os comentários para esta resposta, e por sua ajuda geral com isso - é muito apreciado.

Para extrair todos os arquivos das subpastas para a pasta pai

for /r "PARENTFOLDER" %d in (*.*) do move "%d" "PARENTFOLDER"

Lembre-se de substituir todas as instâncias de PARENTFOLDER pelo caminho da pasta para a qual você deseja extrair os arquivos.

Para extrair todos os arquivos das subpastas e Excluir subpastas vazias

É improvável que você precise manter as subpastas vazias sobrando depois de extrair os arquivos delas - eu certamente não o fiz - então o comando abaixo também automatiza a exclusão delas.

for /r "PARENTFOLDER" %d in (*.*) do move "%d" "PARENTFOLDER" && cd "PARENTFOLDER" && for /f "delims=" %d in ('dir /s /b /ad ^| sort /r') do rd "%d"

Mais uma vez, substitua todas as instâncias de PARENTFOLDER pelo caminho da pasta para a qual você deseja extrair os arquivos.

Por este ponto, no entanto, não é mais um one-liner, e começa a ficar um pouco confuso quando colado na linha de comando, então é mais fácil colocar a coisa toda em um arquivo de lote. A utilização de variáveis para o caminho para a pasta pai permite substituir apenas a instância de PARENTFOLDER no início do arquivo e também é a opção mais segura, evitando qualquer exclusão acidental de pastas vazias que você queira manter.

O arquivo de lote

Cole em um arquivo de texto, substitua PARENTFOLDER pelo caminho da pasta com a qual deseja trabalhar e salve-o com a extensão .bat . Executar em qualquer diretório.

@ECHO OFF
SETLOCAL
SET parent="PARENTFOLDER"
CD /d %parent% 
FOR /r %parent% %%d IN (*.*) DO MOVE "%%d" %parent% 
FOR /f "delims=" %%d IN ('DIR /a:d /s /b ^| SORT /r') DO RD "%%d"
ECHO Done. Press any key to terminate script.
PAUSE >NUL
    
por 17.11.2016 / 03:16