Como posso achatar uma pasta no Windows 7, assumindo que todos os nomes de arquivos sejam diferentes?


19

Por exemplo, diga que eu tenho a seguinte hierarquia de pastas:

Folder1
   File1
   Folder2
      File2
   Folder3
      File3
      Folder4
         File4

Eu quero executar algum comando que resulta em:

Folder1
   File1
   File2
   File3
   File4

ou algo semelhante. Como não estou muito familiarizado com o Windows, gostaria de receber o máximo de detalhes possível na resposta.


Você está procurando um programa existente para fazer isso por você ou um pedaço de código (que linguagem de programação) faz isso?
Matt Bola

@ MattBall: Estou procurando a maneira mais fácil possível de fazer isso. Idealmente, isso seria abrir um terminal e inserir algum comando. Novamente, eu não tenho muita experiência com o Windows, então, deixe-me saber se existe uma maneira melhor. Obrigado.

Respostas:


32

A maneira mais fácil é entrar na pasta raiz comum e pesquisar todos os arquivos (por exemplo, pesquise *). Quando todos os arquivos forem encontrados, marque todos os arquivos, pressione Ctrl + X e navegue para a pasta raiz comum novamente. Agora pressione Ctrl + V para colar todos os arquivos na pasta raiz. Quando terminar, exclua todos os subdiretórios.

Não sei se isso pode ser feito como um trabalho em lotes.


11
Eu gosto da simplicidade disso, mas tentei com arquivos de 40k e travou o processo do explorer.
UpTheCreek

A resposta total do comandante parece mais fácil para mim.
Ev0oD

13

Eu usei essa abordagem do PowerShell no final quando precisei aplainar uma grande estrutura hierárquica (no meu caso, pngs):

Get-ChildItem C:\sourcefolder -Recurse -Filter "*.png" | Copy-Item -destination C:\destinationfolder\

Para achatar, talvez o item de movimentação seja mais adequado?
geisterfurz007 Pare com esse caos 16/10

4

exe do windows: http://en.sourceforge.jp/projects/sfnet_flatfolder/

ou AHK:

fileselectfolder,MyFold,::{20d04fe0-3aea-1069-a2d8-08002b30309d}
SetWorkingDir, %MyFold%
loop, *.*,0,1
{
  parentpath := RegExReplace(A_LoopFileDir,"\\","-")
  ;StringReplace, parentpath, A_LoopFileDir, \,-,All
  newname = %parentpath%-%A_LoopFileName%
  ;msgbox %newname%
  If a_loopfiledir <>
    filemove, %a_loopfilefullpath%,%newname%
}

loop, %myfold%\*.*,2,1
  fileremovedir, %a_loopfilefullpath%,1

exitapp

ou use o Directory Opus

ou PowerShell

(ls -r -include *.jpg) | % { mv -literal $_ $_.Name.Insert(0, [String]::Format("{0} - ", $_.Directory.Name))}

ou Lote (como mencionado acima)

ou a pesquisa manual, recorte e cole como mencionado acima

Existem muitas maneiras, dependendo de sua habilidade e inclinação, você pode escolher qualquer uma dessas opções e refinar de acordo com suas necessidades.

Pode ser necessário remover Diretórios vazios após a operação acima


11
comando PowerShell é curto e bom trabalho
Maxim Yefremov

3

Se você precisar nivelar o dir manualmente de tempos em tempos, o Total Commander é perfeito.

No Total Commander: Vá para o seu diretório que você deseja achatar. No menu, clique em Comandos> Exibição de ramificação . E você vê tudo achatado, pode movê-lo / copiá-lo para outra pasta.

Se você precisar mexer um pouco nos nomes dos arquivos: selecione todos os arquivos na visualização nivelada, no menu vá para Arquivos> Ferramenta de renomeação de múltiplos . Aqui, você pode adicionar algumas informações do caminho aos nomes de arquivos reais usando "Renomear máscara", basta usar a tag / botão do plug-in, pesquisar e substituir o recurso e o pequeno botão foolder, que permite fazer as últimas edições nos nomes de arquivos em editor de texto. Pode parecer complicado, mas realmente é a maneira mais fácil de IMO :)


O que é o Windows Commander? Você quer dizer Total Commander?
UpTheCreek

Exatamente :) Utilizado por 10 anos, o nome era Windows Commander naquela época. Editado
teejay 11/12/13

Obrigado. Apenas tentei. Não iria para o trabalho por 40k arquivos pequenos embora :( consumido uma grande quantidade de CPU por 10 minutos, em seguida, veio com repetiu 'não poderia criar o arquivo' erros.
UpTheCreek

O uso da CPU e a lentidão implícita são lamentáveis, mas compreensíveis :) O erro é outra coisa ... pode ser uma má nomeação, um erro total do comandante ou apenas a incapacidade do TC de lidar com tantos arquivos. Gostaria de tentar renomear menor número de arquivos primeiro ou usar a versão mais recente do TC
teejay

@teejay, eu tive que pescar os detalhes da sua sugestão, mas finalmente consegui fazê-la. Usei o plugin expander2 para extrair partes do caminho e torná-las o prefixo do nome do arquivo. Você pode querer adicionar alguns detalhes para o próximo cara. Tx.
KillKre #

3

Muito simples, com uma opção de linha de comando para aqueles que não são super tecnicamente inclinados.

  1. Crie um arquivo em algum lugar chamado "flatten.cmd"
  2. Abra esse arquivo no bloco de notas
  3. No arquivo, coloque o seguinte:

    FOR /R {SourcePath} %%G IN (*.mp3) DO move "%%G" {Destination}
    
  4. Substitua "{SourcePath}" pela pasta que você deseja achatar. No seu caso "c: \ Folder1"

  5. Substitua "{Destination"} pela pasta para a qual você deseja que os arquivos sejam movidos. No seu caso, também "c: \ Folder1". O código agora deve se parecer com:

    FOR /R c:\Folder1 %%G IN (*.mp3) DO move "%%G" c:\Folder1
    
  6. Abra uma janela de linha de comando. Pode fazer isso de várias maneiras, mas isso é rápido:

    • Clique no botão Iniciar
    • Clique em Todos os Programas
    • Clique em Acessórios
    • Clique em Prompt de Comando
  7. Na janela da linha de comandos, digite:

    cd {folder where you put the flatten.cmd file}
    flatten
    

E isso fará com que (Windows 8+) eu fiz isso para achatar uma pasta de 10.000 arquivos de música. Funciona como um encanto.

Você pode encontrar as opções para o utilitário de linha de comando FOR em https://technet.microsoft.com/en-us/library/bb490909.aspx .


1

usando um script em lote (em cima da minha cabeça):

Procure o comando FOR

A primeira linha move todos os arquivos dos subdiretórios até a raiz. A segunda exclui as subpastas

for /f %f in ('dir "c:\folder\*" /s/b/a-d') do if not %~ff"=="c:\folder" move "%f" "c:\folder"
for /f %f in ('dir "c:\folder\*" /s/b/ad') do if not "%~ff"=="c:\folder" rd /s/q "%f" 

então eu tenho que abrir um terminal e inserir esses comandos, certificando-me de substituir 'pasta' pelo caminho apropriado? Obrigado.

Se você não quiser escrever em um script, sim. OTOH .....
Preet Sangha

Isso pode ser generalizado e anexado a uma ação do menu de contexto? Eu adoraria poder clicar com o botão direito do mouse em um arquivo, clicar em "Achatar arquivo" e depois ter todos os arquivos nele movidos para o nível da pasta. Excluir a pasta depois também seria legal.
MAW74656

sim, pode colocá-lo em um arquivo em lotes com% 1 como nome da pasta. stackoverflow.com/questions/6162415/…
Preet Sangha

-Talvez você possa ajudar com este superusuário.com
q

1

Oi, você também pode usar a ferramenta xxcopy (www.xxcopy.com), sua xcopy em períodos (mais ou menos). Com esta ferramenta, você pode "achatar" os arquivos nas pastas em uma pasta.

c:> xxcopy / pastas de origem / flatten / SG

Basta ler este link: http://www.xxcopy.com/xxcopy16.htm

Felicidades.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.