Estruturar estrutura de diretórios

12

Eu tenho um monte de pastas dentro de pastas. Assim

Root Folder
    -- Folder 1
    -- Folder 2
    -- Folder 3
    -- Folder 4

Eu quero recolher todas as pastas para que todos os arquivos na pasta1, pasta 2, pasta 3, ... pasta n existam na pasta raiz.

Qual é a maneira mais rápida de fazer isso no Windows?

    
por More Than Five 22.02.2013 / 23:27

3 respostas

13

Não há motivos para usar ferramentas especiais ou mesmo scripts. Basta usar a função de pesquisa no Explorer.

  1. Abra a pasta que você deseja nivelar no Explorer.
  2. Crie uma nova pasta, selecione todos os arquivos (mas não as pastas) e arraste-os para essa pasta (isso evitará a obtenção de duas cópias desses arquivos).
  3. Na caixa de pesquisa (a da direita da barra de endereço), digite * e pressione Enter.
  4. Após a lista ser preenchida, clique com o botão direito do mouse e selecione todos, clique com o botão direito e corte.
  5. Prima o botão de voltar para voltar à pasta original e, em seguida, clique com o botão direito e cole.
  6. Se você tiver nomes duplicados, será perguntado sobre como lidar com isso. Escolha a opção mais apropriada para o seu caso de uso. (Eu suponho que seria para copiar os dois arquivos.) Para evitar ser solicitado novamente, certifique-se de aplicar isso a todos os arquivos com a caixa de seleção na parte inferior.
  7. Selecione todas as pastas, verifique se estão vazias, olhando para o pop-up sobre o número de arquivos selecionados e exclua-os.

Se você preferir ter um script para iniciá-lo e esquecê-lo, isso também pode ser feito. O comando para substituir mv *\* . é muito fácil ( for /r %f in (*.*) do @move "%~f" . ), mas tenho certeza que você gostaria de lidar com duplicatas, sem deixá-las para trás, como na resposta de @Nicole Hamilton. Acrescentar um número ao nome de arquivo das duplicatas é provavelmente a maneira mais fácil de fazê-lo.

Copie e cole o seguinte arquivo em lotes no Bloco de Notas e salve-o como "flatten.cmd" (incluindo as aspas):

@echo off
cd "%~1"
md tempryfolder
move *.* tempryfolder
for /r %%f in ("*.*") do call :START "%%~f"
for /r /d %%f in (*.*) do rd "%%~f" 
GOTO :EOF
:START
setlocal
If exist "%~n1%~x1" set /a num=2
:LOOP
If exist "%~n1%num%%~x1" (
    set /a num+=1
    goto loop
)
move "%~1" "%~n1%num%%~x1"

Para usar o script, basta arrastar a pasta que você deseja nivelar sobre ele.

    
por 16.04.2014 / 05:54
3

Você pode achatar no Windows Explorer, navegando até a pasta que deseja nivelar e procurando por System.Kind:<>folder para excluir pastas dos resultados.

Você pode selecionar todos os arquivos com CTRL + A e copiá-los e colá-los em uma nova pasta. Observe que o Windows Explorer perguntará a você como lidar com nomes de arquivos duplicados.

    
por 08.10.2018 / 05:21
0

Esse tipo de coisa é fácil com um shell Unix. Aqui está o que você poderia fazer com meu próprio shell Hamilton C (incluindo o versão gratuita .) Você pode fazer algo muito semelhante com o Cygwin bash.

mv *\* .

Se o seu diretório é realmente grande, é possível que um curinga tenha ocorrido em uma linha de comando muito longa para o Windows passar para um processo filho. (A chamada CreateProcess do Windows limita a lista de argumentos para 32K caracteres Unicode.) Mas a shell C não tem limite internamente, então você poderia iterar toda a lista desta maneira:

foreach i ( *\* )
   mv $i .
end

Para o ponto @ MarkAllen acima, esse tipo de pressupõe que não há nomes duplicados. Se houver, as cópias posteriores na lista substituirão as mais antigas. Se isso é uma preocupação, você pode iterar sobre os arquivos, mv 'ing-los somente se você não está sobrescrevendo. O operador :t é o operador de cauda . O operador -e é o teste arquivo existe .

foreach i ( *\* )
   if ( -e $i:t ) then
      echo -2 $i not moved because it already exists
   else
      mv $i .
   end
end

Isso ainda deixa os diretórios vazios, que talvez você não queira depois que eles forem esvaziados. Essa poderia ser a próxima iteração se importasse.

    
por 23.02.2013 / 00:27

Tags