Como posso mover arquivos de pastas de 2 níveis para pastas de 1 nível?

3

Eu tenho um monte de arquivos armazenados em um diretório de arquivos, como tal

root_folder
  -- folder1
     --folder1_2
       --bunch of files here
  -- folder2
     --folder2_2
       --bunch of files here
  -- folder3
     --folder3_2
       --bunch of files here

Como você pode ver, meus arquivos em uma pasta de 2 níveis da pasta raiz. Como posso mover facilmente meus arquivos, assim o diretório se torna assim:

root_folder
  -- folder1
     --bunch of files here
  -- folder2
     --bunch of files here
  -- folder3
     --bunch of files here

Existe algum programa freeware que eu possa usar? Ou talvez eu possa usar o prompt de comando para realizar isso? Muito obrigado pela ajuda:)

    
por Nicholas Lie 01.01.2012 / 18:00

4 respostas

3

Também forneci um exemplo do Powershell:

$source = "c:\sourceFolder"   
$dirs = dir $source | Where-Object {
$_.PSIsContainer }  

foreach ($folder in $dirs){  
    dir $folder -recurse | Where-Object { ! $_.PSIsContainer } | Move -Destination $folder -WhatIf  
     dir $folder -recurse | Where-Object { $_.PSIsContainer } | rd -recurse -Whatif  
}

Você pode copiar e colar isso no Powershell ISE. Os comutadores whatif em negrito emitem basicamente uma execução a seco.

Você pode verificar a saída para ter certeza de que está movendo os arquivos para exatamente onde deseja. Remova os switches -whatif para tornar o script ativo.

    
por 02.01.2012 / 02:36
2

Solução de Powershell. Use isso em root_folder (certifique-se de que não haja arquivos soltos diretamente sob root_folder ):

gci -R | ?{!$_.PSIsContainer} | %{mv $_.fullname $_.directory.parent}

O item acima coloca qualquer arquivo que encontrar no mesmo diretório em que o diretório pai do arquivo está.

Em seguida, para excluir as pastas agora vazias:

gci -R | ?{(gci $_) -eq $NULL} | rm

    
por 15.02.2012 / 02:41
0

Aqui está um script em lote do Windows para isso.

Esse primeiro script moverá os arquivos somente dentro da estrutura de diretórios, semelhante à mostrada na pergunta do OP.

Edite o valor da variável de script "topfolder" para conter a "pasta base" para a estrutura de diretórios.

Edite o valor da variável de script "subfolderprefix" para conter o prefixo comum para as pastas "primeiro nível" a serem pesquisadas em "topfolder". Na pergunta do OP, esse "prefixo" era "pasta", mas pode ser alterado para qualquer string, se necessário. Usando "pasta" como prefixo, por exemplo, o script procurará pastas como esta:

top_folder
   folder1
   folder2
   folder3
   folder99
   folderABC

mas, outras pastas na pasta "top_folder" serão ignoradas, como estas:

top_folder
   somefolder
   someotherfolder

As subpastas de "segundo nível" que serão pesquisadas pelos arquivos terão um prefixo comum do nome da pasta pai seguido por "_" ( folder1\folder1_xxx ). Novamente, qualquer outra pasta será ignorada:

top_folder
   folder1
       folder1_2
           (Files here will be moved to "folder1")
       folder1_99
           (Files here will be moved to "folder1")
       folder1_ABC
           (Files here will be moved to "folder1")
   folder2
       folder2_2
           (Files here will be moved to "folder2")
       somesubfolder
           (Files here will be skipped)
   folder3
       folder3_1
           (Files here will be moved to "folder3")
       folder3_2
           (Files here will be moved to "folder3")
   folder99
       folder99_XYZ
           (Files here will be moved to "folder99")
   folderABC
       folderABC_123
           (Files here will be moved to "folderABC")
   somefolder
       (Folders here will be skipped)
   someotherfolder
       (Folders here will be skipped)


Aqui está o script em lote:

@echo off

set "topfolder=C:\Temp\SU373589\top_folder"
set "subfolderprefix=folder"

set "startdir=%CD%"
cd /d "%topfolder%"

set ctoptest=0
set cfilecount=0

for /d %%f in ("%subfolderprefix%*") do call :worklevel1 "%%~f"
if %ctoptest% EQU 0 echo There are no matching subfolders in "%topfolder%".
if %cfilecount% EQU 0 echo There were no files moved.
if %cfilecount% EQU 1 echo %cfilecount% file was moved.
if %cfilecount% GEQ 2 echo %cfilecount% files were moved.

cd /d "%startdir%"
goto :EOF





:worklevel1

set "subfolder=%~1"
set /a ctoptest+=1

echo Processing subfolder "%subfolder%" ...

set "subsubfolderprefix=%subfolder%\%subfolder%_"
set cwork1test=0

for /d %%g in ("%subsubfolderprefix%*") do call :worklevel2 "%%~g"
if %cwork1test% EQU 0 echo There are no matching subfolders in "%subfolder%"
echo.

set "subfolder="
set "subsubfolderprefix="
set cwork1test=
goto :EOF





:worklevel2

set "subsubfolder=%~1"
set /a cwork1test+=1

echo Processing subsubfolder "%subsubfolder%" ...
set cwork2test=0

for %%h in ("%subsubfolder%\*") do call :workmove "%%~h"
if %cwork2test% EQU 0 echo There are no files to move in "%subsubfolder%"

set "subsubfolder="
set cwork2test=
goto :EOF





:workmove

set "targetfile=%~1"
set /a cwork2test+=1
set /a cfilecount+=1

echo Moving file "%targetfile%" to "%subfolder%" (%cwork2test%)...

move "%targetfile%" "%subfolder%" >nul 2>&1

set "targetfile="
goto :EOF



Esse segundo script em lote funcionará de maneira semelhante, procurando em TODAS as subpastas de "primeiro nível" e movendo todos os arquivos de todas as subpastas de "segundo nível" para as subpastas de "primeiro nível". Ele não procurará corresponder a nenhum "prefixo" para nenhum dos nomes de pastas.

Edite o valor da variável de script "topfolder" para conter a pasta base da estrutura de diretórios.

@echo off

set "topfolder=C:\Temp\SE373589\top_folder"

set "startdir=%CD%"
cd /d "%topfolder%"

set ctoptest=0
set cfilecount=0

for /d %%f in ("*") do call :worklevel1 "%%~f"
if %ctoptest% EQU 0 echo There are no matching subfolders in "%topfolder%".
if %cfilecount% EQU 0 echo There were no files moved.
if %cfilecount% EQU 1 echo %cfilecount% file was moved.
if %cfilecount% GEQ 2 echo %cfilecount% files were moved.

cd /d "%startdir%"
goto :EOF





:worklevel1

set "subfolder=%~1"
set /a ctoptest+=1

echo Processing subfolder "%subfolder%" ...
set cwork1test=0

for /d %%g in ("%subfolder%\*") do call :worklevel2 "%%~g"
if %cwork1test% EQU 0 echo There are no matching subfolders in "%subfolder%"
echo.

set "subfolder="
set cwork1test=
goto :EOF





:worklevel2

set "subsubfolder=%~1"
set /a cwork1test+=1

echo Processing subsubfolder "%subsubfolder%" ...
set cwork2test=0

for %%h in ("%subsubfolder%\*") do call :workmove "%%~h"
if %cwork2test% EQU 0 echo There are no files to move in "%subsubfolder%"

set "subsubfolder="
set cwork2test=
goto :EOF





:workmove

set "targetfile=%~1"
set /a cwork2test+=1
set /a cfilecount+=1

echo Moving file "%targetfile%" to "%subfolder%" (%cwork2test%)...

move "%targetfile%" "%subfolder%" >nul 2>&1

set "targetfile="
goto :EOF



Uma versão mais simples do script em lote, sem toda a verificação de pastas vazias, etc ...:

@echo off

set "topfolder=C:\Temp\SE373589\top_folder"

set "startdir=%CD%"
cd /d "%topfolder%"

for /d %%f in (*) do (
    echo Processing folder: "%%~f"
    for /d %%g in ("%%f\*") do (
        echo Processing sub-folder: "%%~g"
        for %%h in ("%%~g\*") do (
            echo Moving file: "%%~h"  to  "%%~f"
            move "%%~h" "%%~f" >nul 2>&1
        )
    )
    echo.
)

cd /d "%startdir%"



E, finalmente, um script "mínimo" sem mensagens e supondo que você já esteja na "pasta base" adequada:

@echo off
for /d %%f in (*) do (
    for /d %%g in ("%%f\*") do (
        for %%h in ("%%~g\*") do move "%%~h" "%%~f" >nul 2>&1
    )
)



E, caso você espere, um "one liner" pode ser executado a partir do prompt de comando:

@for /d %f in (*) do @(for /d %g in ("%f\*") do @(for %h in ("%~g\*") do @move "%~h" "%~f" >nul 2>&1))
    
por 18.11.2015 / 00:48
-1

No Explorer (assumindo o Windows aqui) abra a pasta1_2, selecione todos os arquivos, clique com o botão direito & escolha Mover para Pasta ..., selecione Pasta1 no diálogo; em seguida, exclua a pasta1_2 se essa for sua intenção.

Repita o procedimento acima para todas as subpastas que você deseja limpar.

Não há necessidade de nenhum programa externo.

    
por 01.01.2012 / 20:49