Mover todos os arquivos de várias subpastas para a pasta pai

5

Eu normalmente abriria a pasta pai e procuraria por * para selecionar todos os arquivos em subpastas, mas neste caso, eu tenho mais de 1.000.000 de arquivos que eu preciso classificar, então meu explorador geralmente falha quando tentando copiar muitos arquivos através da GUI. Não tenho certeza de quanto isso será mais eficaz através do prompt de comando ou de um arquivo de lote, mas vale a pena tentar, suponho.

O que eu preciso fazer é fazer com que

|parent
|    |123
|    |    123abc.png
|    |456
|    |    456def.png
|    |789
|    |    789ghi.png

torna-se

|parent
|    123abc.png
|    456def.png
|    789ghi.png

Sim, minha estrutura de arquivos atual tem os 3 primeiros caracteres do nome do arquivo dado ao nome da pasta, se isso puder ajudar na classificação deles.

    
por Wulfre 13.11.2015 / 04:32

2 respostas

11

Use FOR / R no prompt de comando:

[FOR /R] walks down the folder tree starting at [drive:]path, and executes the DO statement against each matching file.

Primeiro, crie uma pasta de teste fora da pasta pai da qual você está movendo os arquivos. Isso evitará possíveis referências circulares.

No seu caso, o comando seria algo como isto:

FOR /R "C:\Source Folder" %i IN (*.png) DO MOVE "%i" "C:\Staging Folder"

Se você quiser colocar isso em um arquivo de lote, altere %i para %%i .

Observe que as aspas duplas são importantes, não perca nenhuma delas. Eles garantem que qualquer nome de arquivo contendo espaços seja tratado corretamente.

Quando a movimentação estiver concluída, você poderá renomear / mover a pasta de teste conforme necessário.

DICA: Se você tiver espaço no disco rígido para queimar e tempo na mão, você pode querer jogar com segurança e copiar os arquivos, em vez de movê-los, caso algo dê errado. Basta alterar MOVE para COPY no comando acima.

    
por 13.11.2015 / 07:23
1

Use também a variável de ambiente %% ~ dpi, que se refere à pasta em que os arquivos estão. Você pode, então, remover a barra invertida que, em seguida, obteria a pasta pai dos arquivos. Abaixo faz exatamente isso.

SetLocal EnableDelayedExpansion   
FOR /R "C:\Source Folder" %%i IN (*.png) DO (       
       Set "CurrFile=%%~i"     
       Set "TMPdp=%%~dpi"   
       Set "ParFldr=!TMPdp:~0,-1!"    
       @Echo MOVE "%%~i" "!ParFldr!" ) & REM Delete echo to move. Run to test.

O! ativa Expansão Dinâmica e pode ser usado para o %% ~ i assim como para o ParFldr. Então o %% ~ i pode ser! CurrFldr! Isso será realmente necessário durante o teste, pois alguns arquivos terão strings que o Batch não vai gostar. Por não gostar, quero dizer, eles farão com que o script falhe e saia. Acabei de alterar todos os %% A para %% i para maior clareza. Realmente não faz diferença se um A foi usado ou um minúsculo i O que importa é sempre usar a mesma letra, então eu mudei cada %% A para um %% i.

    
por 13.11.2015 / 12:21