Como faço para excluir uma pasta aninhada bastante profunda e evitar "Nome do arquivo por muito tempo"?

70

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

dir1\dir1\dir1\dir1\...

Não consigo excluir esta pasta no Windows via Explorer, delnem os rmdircomandos ou nem o comando Cygwin 'rm'. Como devo remover esta pasta muito longa?

Ele continua dizendo "O nome do arquivo é muito longo ..."

user39186
fonte

Respostas:

105

Se você é como eu e não gosta de instalar software adicional para corrigir um problema como esse, eu usaria a sugestão do XQYZ e a usaria robocopypara resolvê-lo. (No meu caso, o problema foi criado pela robocópia em primeiro lugar, copiando um diretório que continha pontos de junção recursivos sem fornecer / XJ à robocópia).

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

O processo passo a passo total é tão simples quanto isto:

  1. cd c:\subdir\more para 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 diretório ofensivo.
  4. Depois de alguma espera, você está pronto! Finalize com:
  5. rmdir offending_dir para se livrar do diretório ofensivo agora vazio e
  6. rmdir empty livrar-se do seu diretório vazio intermediário.
jofafrazze
fonte
2
Excelente sugestão. Meu problema também foi criado pelo robocopy e, como você descreveu, a correção do robocopy funcionou para mim.
Nathan Garabedian
3
Eu também fiz uma bagunça com os robocopypontos de junção; obrigado por me mostrar como usá-lo para limpar a bagunça!
Mr.Wizard
minhas pastas não foram criados por robocopy mas removido-los perfeitamente
Sasha
11
O NPM (Gerenciador de Pacotes de Nó) causou esse problema para mim. Havia muitos pacotes aninhados por algum motivo.
precisa saber é o seguinte
este é claramente o melhor e mais razoável resposta, muito melhor do que um script em lotes recursiva bespoke
monástica-pânico
39

Na verdade, isso é bastante simples de corrigir. Diga que a estrutura de diretórios é a seguinte:

C:\Dir1\Dir1\Dir1\Dir1…

Para corrigi-lo, basta renomear cada pasta para um nome de pasta com um caractere até que não seja mais longo para excluir:

  1. Renomeie C:\Dir1paraC:\D
  2. Navegar para C:\D\
  3. Renomeie C:\D\Dir1paraC:\D\D
  4. Navegar para C:\D\D\
  5. Vá para 1 até que o comprimento total do caminho seja <260

Aqui está um arquivo em lotes para automatizar o processo (esta 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:\Dir1para C:\Dir1\Dir1\Dir1…ou C:\Users\Bob\Desktop\New Folderpara 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 são inversas; você não pode consertá-lo trabalhando a partir do diretório mais interno para fora; precisa seguir na outra direção.

Ao tentar acessar um diretório, você o faz usando seu caminho absoluto, explicitamente ou não, 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 mais interno Dir1é 22. No entanto, o comprimento do caminho para o mais externo Dir1é apenas 7 e, portanto, ainda é acessível, independentemente do 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 sobre o comprimento total do caminho de seus diretórios filhos; apenas seus diretórios ancestrais - você não pode renomear um diretório se o comprimento total do caminho for muito longo).

Portanto, quando você encontra um caminho 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 contrário também é verdadeiro. Você não pode criar um caminho maior que o comprimento máximo suportado (no DOS e Windows MAX_PATH = 260). No entanto, você pode renomear diretórios, trabalhando desde o interior até o exterior, 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" ou seguros, uma vez que são simples o suficiente para serem acessados, portanto, não use esse método para ocultar arquivos.)


Nota lateral interessante

Se você criar pastas no Windows 7 Explorer, pode parecer que o Explorer permita criar subdiretórios de forma que o comprimento total seja maior que MAX_PATH, e na verdade é, no entanto, ele está trapaceando usando “nomes de arquivos do DOS 8.3”. 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 que 260. Além disso, se você navegar para o subdiretório mais interno do Explorer, ele será exibido conforme o esperado na barra de endereços quando não estiver em foco, mas quando você clicar no endereço barra, 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, mas se recusa firmemente 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 NtfsDisable8dot3NameCreationopção está definida.

Synetech
fonte
3
Ele é possível criar um caminho mais longo do que MAX_PATH, como explicado aqui . Infelizmente, \\?` doesn't work with rmdir`.
grawity
@ grrawity, sim, mas é porque funciona sob o mesmo princípio: um caminho curto é renomeado para um caminho mais longo; isso é feito dinamicamente, expandindo uma variável, em vez de renomeá-la manualmente para outra. Não é possível criar um diretório cujo caminho absoluto seja muito longo quando o comando de criação tiver informações suficientes para determinar o comprimento total.
Synetech
3
@ Synetech: Não, funciona de forma diferente. Caminhos como \\?\C:\dir\dir\dir\dirliteralmente ignoram MAX_PATH; não há "variáveis" envolvidas. (Mas como eu disse, ele não funciona com rmdirou outros cmd.exebuiltins por algum motivo.)
grawity
por exemplo, tente executar md C:\01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Não funcionará porque o sistema de arquivos possui informações suficientes para determinar que o comprimento total do caminho seria de 263 caracteres, portanto falhará.
Synetech 11/03/11
2
(Além disso, não confundir o caminho comprimento com componente comprimento Você não pode ter um. Único diretório com um nome mais de 255 caracteres, no entanto, você pode ter um caminho muito mais tempo do que isso.)
grawity
17

Você pode encurtar o caminho usando substpara 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 *.*

Remova a unidade virtual:

cd C:\TEMP
subst Z: /d

Remova o diretório:

rd /s dir1
Matthew Simoneau
fonte
Não; esse primeiro comando não funcionará se o diretório for muito longo; retornará o erro Parâmetro inválido .
Synetech
2
@ Synetech, claro, mas se você substituir apenas C:\TEMP\dir1\dir1\dir1, ele diminuirá parte dela, permitindo que você entre. É exatamente como a sua sugestão de renomear, mas com o mapeamento. ;)
Bobson
@ Bobson, tudo bem, você está certo; +1 para vocês dois. :-)
Synetech 21/11
10

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

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

http://deepremove.codeplex.com

JPJofre
fonte
TRABALHO!!! Esta resposta deve ser marcada como funcionando! O software funciona como manteiga .. resolveu meu problema em poucos segundos !! Obrigado!
Rafique Mohammed 02/02
7

Há algum tempo atrás, criei um pequeno executável utilitário chamado DeleteFiles que você pode usar para executar essa tarefa facilmente.

Usando este utilitário independente, você pode simplesmente fazer:

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

para excluir toda a estrutura de pastas. -r recursa 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 a especificação do arquivo). O DeleteFiles suporta caminhos maiores que o limite do Windows MAX_PATH, 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 o Chocolatey

Rick Strahl
fonte
Obrigado, ferramenta incrível, ++ por colocá-lo em chocolate;) Facilita a integração em uma ferramenta de IC!
Charles Ouellet 27/03
11
Isso fez o truque. Se você tem um caminho realmente longo, adicionar > NULao final pode tornar o processo mais rápido.
ryscl
A solução de robocópia não funcionou para mim e nem para a solução da Synetech. DeleteFiles funcionou para mim, mas por algum motivo eu tive que executá-lo três vezes para que todas as subpastas fossem excluídas. De qualquer forma, isso resolveu meu problema.
Frank
Re: executando DeleteFiles 3 vezes. Também vi isso - acredito que seja devido a algumas peculiaridades do Windows que bloqueiam pastas com arquivos por um curto período de tempo, mesmo após a exclusão dos arquivos. Várias passagens detectam falhas ocasionais desse problema em subpastas - potencialmente com vários ninhos. Vejo o mesmo comportamento com o Explorer exclui árvores profundas.
Rick Strahl
5

Simples e fácil agora

Eu estava enfrentando esse mesmo problema há tanto tempo com node_modules que pastas muito aninhadas. finalmente, criou um script para corrigir o que pode excluir pastas, encurtando os caminhos.

https://github.com/dev-mraj/fdel

npm install fdel -g

fdel ./node_modules
dev.meghraj
fonte
Não sei por que os designers optaram por incluir todas as dependências de uma estrutura quando poderiam ter feito uma estrutura plana. Então, esse script foi a maneira mais fácil para mim como eu já estou usando node.js
user2610529
4

Enquanto trabalhava com o Sikuli, levantei-o com um loop de recursão Calculator.sikuli no programa que gerou uma quantidade incontável de dirs "calculator.sikuli.calculator.sikuli". Eu poderia mover a árvore, mas o nome do caminho era muito longo para excluir.

Depois de tentar várias soluções com o popd loop, Scandisk e chegando (perceptivelmente) a lugar nenhum ....

Eu escrevi esse script para 'aprofundar' nos diretórios recorrentes (em um dir chamado 'a'), movê-los (para um dir chamado 'b'), excluir a árvore truncada e movê-los 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 infinitamente recursivas
  • O 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 lotes novamente.

SiloSix
fonte
Passei horas investigando isso. Esse arquivo .bat é como um presente do céu. Você, silo, é um anjo. xD
Squish 06/10
2

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

XQYZ
fonte
1

Eu tentaria abrir um prompt de comando e executar:

rmdir /s <directory>

Se isso não funcionar, eu cdaria parte da árvore de diretórios e tentaria excluir um subconjunto dos diretórios - digamos, os 20 diretórios mais internos - e, então, sairia dali.

Jesse S.
fonte
11
Eu tentei a sua sugestão acima e ainda diz: "Diretório não está vazio" quando eu executar o comando acima vários níveis de profundidade
user39186
11
Isso ocorre porque esse método é inverso. ;-)
Synetech 11/03/11
1

Se for uma pasta de rede, compartilhe o diretório pai desse diretório e mapeie-o para uma unidade em sua máquina local e exclua sua pasta.

Punnakadu
fonte
21966 [principal] mv 1288 D: \ trabalho \ software \ cygwin \ bin \ mv.exe: *** erro real - erro interno ao ler o ambiente do Windows - muitas variáveis ​​de ambiente?
user39186
Tentei mover aa sub-pasta de 20 níveis de profundidade e tem o erro acima
user39186
1

Abra um prompt de comando.

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

c:\> RD /s dir1

Editar (após os comentários adicionados) :

Outras idéias:

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

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

Talvez escreva algo (já que você possui o Eclipse) que navega até o final e depois retira um nível de pasta por vez, excluindo à medida que avança?

Ƭᴇcʜιᴇ007
fonte
11
Eu recebo as seguintes 3 erros ao usar o diretório command.The acima não está vazio O sistema não pode encontrar o caminho especificado O nome do arquivo é muito longo
user39186
Eu tentei atravessar dizer 'n' os níveis de fundo e tentou usar o mesmo comando, mas não parece ajudar
user39186
isso funcionou para mim no win7! graças
Leoh
1

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

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

Loren Pechtel
fonte
1

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

então ao invés de

rmdir /s/q c:\mydirectory

usar

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

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

Steve Cooper
fonte
Não funciona The path \\?\C:\temp\wqiyretiuqyertiuyqwteiyrutqwuiyertiqrqweirqyert\wqteriuwqyetriuqwteiryutwiuertiuyqerieerrt\IOQWUE~1\QIWUYE~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\ OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1 is too long.Windows 7 de 64 bits.
213 Victor Victor
Não funciona no Windows 10. Ainda é muito longo.
BananaAcid
A versão `\\?` Funcionou para mim no Windows 10!
Peter Peter
0

Quando tenho esse problema, simplesmente renomeio alguns nomes de pastas muito mais curtos; depois que o caminho total for curto o suficiente, ele excluirá OK. Não são necessárias ferramentas extras.

music2myear
fonte
Sim, mas como eu disse, você tem que trabalhar de fora para dentro, caso contrário não funcionará.
Synetech
Claro. Geralmente, descobri que os nomes de pastas mais longos tendem a ser os primeiros (nas pastas de correção) ou os últimos. Na maioria das vezes, você só precisa alterar um ou dois nomes de pastas para obter o tamanho certo.
Music2myear 8/09/11
Sim, mas se você começar com o mais interno, ele não funcionará porque o rencomando falhará path too long.
Synetech
11
Sim, os scripts fornecidos acima são um método inteligente e eficaz de lidar com esse problema automaticamente. Isso só aconteceu comigo algumas vezes e, portanto, simplesmente usei o processo de renomeação manual. Para fazer isso, simplesmente começo a renomear a estrutura de pastas onde quer que esteja na árvore ofensiva, e minha experiência é que os nomes de pastas mais longos aparecem com mais frequência no início ou no final da estrutura da árvore. Minha resposta é, portanto, válida, embora provavelmente não seja a mais forte ou a mais inteligente aqui. Não vale a pena um voto negativo.
music2myear
> Simplesmente começo a renomear a estrutura de pastas onde quer que esteja na árvore ofensiva. Bem, sim, se você já estiver dentro da árvore, certamente poderá renomear pelo menos essa pasta (precisará ir para o pai) ; você pode renomear uma subpasta também, mas pode ser muito longo.
Synetech
0

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

Está localizado no menu Ferramentas.

mrshl
fonte
0

Corri para o mesmo problema com uma confusão de pastas com mais de 5000 diretórios que algum aplicativo Java fazia e escrevi um programa que o ajudará a remover esta pasta. Todo o código fonte está neste link:

https://gitlab.imanolbarba.net/imanol/DiREKT

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

Imanol Barba Sabariego
fonte
-3

Seu sistema de arquivos pode estar corrompido. Execute o chkdsk para verificar se ele repara alguma coisa e tente excluir a pasta.

malabarista
fonte
Não, esse não é o problema. O problema é que o comprimento total do caminho é maior do que o suportado ( MAX_PATH=255). Isso pode acontecer mesmo com um sistema de arquivos não corrompido.
Synetech 11/03/11
A execução do chkdsk na pasta me deu o seguinte erro. A unidade, o caminho ou o nome do arquivo não é válido
user39186