Como eu excluo uma pasta que é aninhada bem profunda e evito “Nome do arquivo muito longo”?

65

O Eclipse criou uma pasta temporária em um dos diretórios aninhados bem fundo, por exemplo

dir1\dir1\dir1\dir1\...

Não consigo excluir esta pasta no Windows por meio do Explorer, os comandos del ou rmdir nem o comando Cygwin 'rm'. Como devo remover essa pasta muito longa?

Ele continua dizendo "Nome do arquivo por muito tempo ..."

    
por user39186 11.03.2011 / 05:30

17 respostas

95

Se você é como eu e não gosta de instalar software adicional para corrigir um problema como este, eu usaria XQYZ sugestão e use robocopy para resolver o problema. (No meu caso, o problema foi criado pelo robocopy em primeiro lugar, copiando um diretório que tinha pontos de junção recursivos nele sem fornecer / XJ para robocopy).

Para excluir a árvore de diretórios que começa em c: \ subdir \ more \ offending_dir :

O processo passo-a-passo total é tão simples assim:

  1. cd c:\subdir\more para o cd em seu diretório pai.
  2. mkdir empty para criar um diretório vazio.
  3. robocopy empty offending_dir /mir para espelhar o diretório vazio no ofensivo.
  4. Depois de alguma espera você está feito! Termine com:
  5. rmdir offending_dir para se livrar do diretório ofensivo agora vazio e
  6. rmdir empty para se livrar do diretório vazio intermediário.
por 12.06.2011 / 23:27
38

Isso é realmente simples de corrigir. Digamos que a estrutura de diretórios seja assim:

C:\Dir1\Dir1\Dir1\Dir1…

Para corrigir isso, basta renomear cada pasta para um nome de pasta de um caractere até que não seja mais longo excluir:

  1. Renomear C:\Dir1 para C:\D
  2. Navegue até C:\D\
  3. Renomear C:\D\Dir1 para C:\D\D
  4. Navegue até C:\D\D\
  5. Ir até 1 até o comprimento total do caminho ser < 260

Veja um arquivo em lote para automatizar o processo (essa versão simples é melhor para diretórios simples como o descrito na pergunta, especialmente para os descartáveis). Passe a pasta mais alta possível (por exemplo, C:\Dir1 para C:\Dir1\Dir1\Dir1… ou C:\Users\Bob\Desktop\New Folder para C:\Users\Bob\Desktop\New Folder\abcdefghi… )

@echo off
if not (%1)==() cd %1
for /D %%i in (*) do if not %%i==_ ren "%%i" _
pushd _ 
%0 
popd

Explicação técnica

As outras soluções propostas estão para trás; você não pode consertá-lo indo do diretório mais interno para fora, você precisa ir na outra direção.

Quando você tenta acessar um diretório, você o faz usando seu caminho absoluto, explicitamente ou não, que inclui tudo o que veio antes dele. Portanto, para uma estrutura de diretório como C:\Dir1\Dir1\Dir1\Dir1 , o comprimento do caminho para o inner Dir1 é 22. No entanto, o comprimento do caminho para o outer Dir1 é apenas 7 e, portanto, ainda é acessível independentemente de seu conteúdo (no contexto do caminho de um determinado diretório, o sistema de arquivos não tem conhecimento do que contém ou do efeito que tem no comprimento total do caminho de seus diretórios filhos; somente seus diretórios ancestrais - você não pode renomear um diretório se o caminho total -length será muito longo).

Portanto, quando você encontrar um caminho que é muito longo, o que você precisa fazer é ir para o nível mais alto possível e renomeá-lo para um nome de um caractere e repetir para cada nível nele. Cada vez que você faz isso, o comprimento total do caminho diminui pela diferença entre o nome antigo e o novo nome.

O oposto também é verdadeiro. Você não pode criar um caminho que seja maior que o comprimento máximo suportado (no DOS e no Windows, MAX_PATH = 260 ). No entanto, você pode renomear diretórios, trabalhando do mais interno para fora, para um nome mais longo. O resultado é que pastas mais profundas cujo caminho absoluto é > 260 estarão inacessíveis. (Isso não os torna "ocultos" nem seguros, pois são simples o suficiente para chegar, portanto, não use esse método para ocultar arquivos.)

Nota Interessante

Se você criar pastas no Windows 7 Explorer, pode parecer que o Explorer permite criar subdiretórios de modo que o comprimento total seja maior que MAX_PATH e, na verdade, é, no entanto, é trapacear usando “DOS 8.3 nomes de arquivos ”. Você pode ver isso criando uma árvore como a seguinte:

C:\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
   \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
    \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
     \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
      \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
       \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
        \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
         \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
          \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
           \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
            \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\

Tem 696 caracteres, o que obviamente é muito maior do que 260. Além disso, se você navegar para o subdiretório mais interno no Explorer, ele será exibido como esperado na barra de endereço quando não estiver em foco, mas quando você clicar na barra de endereço, ele altera o caminho para C:\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ , que tem apenas 102 caracteres.

No XP, ele não faz isso, em vez disso, recusa-se a criar um caminho mais longo do que o suportado.

O que seria realmente interessante é descobrir como o Windows 7 Explorer lida com "caminhos muito longos" quando a opção NtfsDisable8dot3NameCreation está definida.

    
por 11.03.2011 / 06:49
16

Você pode reduzir o caminho usando subst para criar uma unidade virtual:

C:\>subst Z: "C:\TEMP\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1"

Mude para a unidade virtual:

cd Z:

Agora você pode excluir os arquivos:

del *.*

Remover o disco virtual:

cd C:\TEMP
subst Z: /d

Remova o diretório:

rd /s dir1
    
por 06.09.2011 / 17:12
10

Eu escrevi um pequeno aplicativo C # para me ajudar a excluir uma estrutura muito profunda gerada por um uso descuidado do Robocopy e um backup do Homeserver; Por padrão Robocopy trata os pontos de junção como pastas regulares ... :-( Você pode acabar com uma grande bagunça sem perceber isso.

A ferramenta está disponível no CodePlex com arquivos de origem, para qualquer um usar.

http://deepremove.codeplex.com

    
por 16.04.2011 / 03:36
7

Há algum tempo, criei um pequeno executável de utilitário independente chamado DeleteFiles que você pode usar para executar essa tarefa com facilidade.

Usando esse utilitário autônomo, você pode simplesmente fazer:

deletefiles c:\yourfolder\subfolder\*.* -r -f

para excluir toda a estrutura de pastas. -r recurses a hierarquia de pastas do diretório inicial para baixo, -f exclui todas as pastas que estão vazias (que serão todas elas se você usar . como o filespec). DeleteFiles suporta caminhos mais longos que o limite MAX_PATH do Windows para que funcione bem em pastas profundamente aninhadas.

DeleteFiles é gratuito e de código aberto e você pode pegar o código binário ou fonte do GitHub ou instalar diretamente usando Chocolatey

    
por 26.03.2015 / 01:19
5

Simples e amp; Fácil agora

Eu estava enfrentando esse mesmo problema desde tanto tempo com node_modules que pastas muito aninhadas. Então, finalmente fizemos um script para consertar o que pode excluir pastas encurtando caminhos.

link

npm install fdel -g

fdel ./node_modules
    
por 02.02.2016 / 15:20
4

Enquanto trabalhava com o Sikuli, eu fiquei com um loop de recursão Calculator.sikuli no programa que fazia uma quantidade incontável de diretórios "calculator.sikuli.calculator.sikuli". Eu poderia mover a árvore, mas o nome do caminho é muito longo para ser deletado.

Depois de tentar várias soluções com loop popd, Scandisk e obtendo (perceptivelmente) nada ...

Eu escrevi esse script para "aprofundar" nos diretórios recursed (em um diretório chamado 'a'), mova-os (para um diretório chamado 'b'), exclua a árvore truncada, mova-os de volta (para ' a ') e repita:

1)cd D:\a\calculator.sikuli\calculator.sikuli\calculator.sikuli\calculator.sikuli
.............go deeeeeep in         dir *A*
2) move calculator.sikuli ---> D:\b    
.............move the crazy tree to dir *B*    
3) kill D:\a\calculator.sikuli <---KILL(rd)    
.............wipe dir *A*'s tree    
4) move D:\b\calculator.sikuli ---> D:\a\    
.............move the crazy tree back to dir *A*    
REPEAT
  • REM Usado para excluir subpastas recursivamente infinitas
  • REM sugere interromper o serviço de pesquisa do Windows primeiro (services.msc)

Remdirs.bat

D:
cd D:\a\calculator.sikuli\calculator.sikuli\calculator.sikuli\calculator.sikuli
move /-Y calculator.sikuli D:\b
cd D:\b
rd /s/q D:\a\calculator.sikuli
move /-Y calculator.sikuli D:\a
call D:\remdirs2.bat

Esta é apenas uma chamada para executar o arquivo em lote novamente.

    
por 09.08.2012 / 11:12
2

Tivemos um problema como este no trabalho quando o eclipse decidiu criar lixo nos discos rígidos. Corrigimos isso usando a função MIR do robocopy para espelhar um diretório vazio no diretório aninhado.

    
por 11.03.2011 / 07:25
1

Eu tentaria abrir um prompt de comando e executar:

rmdir /s <directory>

Se isso não funcionar, eu colocaria cd na árvore de diretórios e tentaria excluir um subconjunto dos diretórios - digamos, os 20 diretórios mais internos - e depois sairia de lá.

    
por 11.03.2011 / 05:50
1

Se for uma pasta de rede, basta compartilhar o diretório pai desse diretório e mapeá-lo para uma unidade em sua máquina local e, em seguida, excluir sua pasta.

    
por 11.03.2011 / 06:02
1

Abra um prompt de comando.

Navegue até a pasta / diretório que contém o maior 'dir1' (vamos supor que C: \)

c:\> RD /s dir1

Editar (após comentários adicionados) :

Outras ideias:

O MS oferece informações sobre como lidar com o problema (muitas idéias para tentar) aqui .

Há também essa ferramenta (nunca usada pessoalmente) - TooLongPath .

Talvez escreva alguma coisa (desde que você tenha o Eclipse) que navegue até o fim e, em seguida, faça o backup de um nível de pasta por vez, excluindo como está?

    
por 11.03.2011 / 05:44
1

Outra solução: baixe o Total Commander. É um programa muito útil, não só porque é longo nome do arquivo ciente.

A versão não registrada é nagware, mas totalmente funcional, fará o trabalho.

    
por 10.07.2012 / 00:23
1

Isso pode ser feito diretamente na linha de comando ou em um arquivo em lote, construindo um caminho UNC para o diretório que você deseja excluir

então, em vez de

rmdir /s/q c:\mydirectory

use

rmdir /s/q \?\c:\myDirectory

Caminhos estilo UNC como esse podem ser muito mais longos e ignorar o limite de 260 caracteres.

    
por 13.04.2015 / 15:24
0

Quando tenho este problema, simplesmente renomeio alguns dos nomes das pastas muito mais curtos, então, uma vez que o caminho total seja curto o suficiente, ele apagará OK. Nenhuma ferramenta extra necessária.

    
por 13.06.2011 / 16:23
0

Eu tive o mesmo problema, exceto que ele foi criado por uma tarefa recursiva de Cobian Backup. Acontece que o software gratuito Cobian inclui um aplicativo Deleter que pode facilmente remover essas pastas aninhadas super rapidamente.

Ele está localizado no menu de ferramentas.

    
por 14.09.2012 / 15:26
0

Eu me deparei com o mesmo problema com uma pasta de pastas com mais de 5000 diretórios que alguns aplicativos Java fizeram e escrevi um programa que ajudará a remover essa pasta. Todo o código-fonte está neste link:

link

Ele removeu tudo depois de um tempo, mas conseguiu fazer o trabalho, espero que ajude as pessoas que (como eu) enfrentam o mesmo problema frustrante

    
por 09.08.2015 / 00:37
-3

Seu sistema de arquivos pode estar corrompido. Execute o chkdsk para ver se ele conserta algo e tente excluir a pasta.

    
por 11.03.2011 / 06:15