Como remover uma árvore de diretórios infinitamente recorrente?

9

Em um de nossos servidores de arquivos do Windows 2003, de alguma forma, alguém ou algo conseguiu criar árvores de diretórios infinitamente recorrentes em algumas das pastas iniciais dos usuários e não pode ser excluído.

Você acaba com algo assim:

D:\Student\2012\user.name\servername\student\2012\user.name\servername\student\2012\...

E continua infinitamente até onde pude dizer.

Tentar excluir a árvore de diretórios do sistema em que reside resulta em "Erro ao excluir arquivo ou pasta: Não é possível excluir o arquivo:". Tentar excluí-lo de um sistema Windows 7 conectado ao compartilhamento de rede resulta em um erro "pasta em uso".

Se você navegar pela árvore de diretórios o mais longe possível, alcançará um diretório que não pode ser aberto ou excluído (se clicar com o botão direito do mouse, nenhuma das opções padrão aparece); no entanto, se você tentar abrir o mesmo diretório de um compartilhamento em outro sistema Ele pode ser aberto, no entanto, o Windows Explorer fica extremamente lento.

Eu tentei as sugestões deste post, além de inicializar o servidor com um disco Linux e tentar rm -rf o diretório, nem funcionou.

É um mistério.

Editar: Eu também posso acrescentar que é possível renomear os diretórios, apenas não removê-los.

EnglishInfix
fonte
11
Um problema semelhante foi resolvido na falha do servidor .
Lilienthal

Respostas:

14

Eu também tinha uma pasta interminável recursiva criada por um IDE java e não conseguia excluí-la no Windows Explorer ou no prompt do cmd.

No entanto, quando instalei o git, também instalei o git-bash. No git-bash, você pode emitir o comando:

rm -rfd recursive_folder_name

e vai cuidar disso.

cdjohnk
fonte
Nota importante: isso pode levar uma quantidade enorme de tempo ... Faça uma pausa, comer alguma coisa, beber um café, e deixe ferramenta Unix fazer o seu trabalho;) Surpreendentemente ele funciona
Antwane
também funciona se o uso de um linux vmware base e montar a unidade (se for externo ...)
Wolfgang Fahl
4

É possível que exista um link simbólico para uma pasta em algum lugar, provavelmente o segundo studentno seu caminho.

Tente executar o comando:

dir D:\Student\2012\user.name\servername

e veja se studentestá marcado como DIR ou SYMLINK / JUNCTION.

Por exemplo, esta é uma saída típica do dircomando:

04/24/2012  10:58 PM    <DIR>          .
04/24/2012  10:58 PM    <DIR>          ..
04/24/2012  10:58 PM    <SYMLINKD>     a [h:\a]

Você vê que as duas primeiras entradas estão marcadas como DIR, enquanto a terceira (um link simbólico para outra pasta) está marcada como SYMLINKD. No seu caso (Windows 2003), acho que existem JUNCTIONs em vez de SYMLINKs.

Se a studentpasta for um link ou junção simbólica, execute os comandos:

cd /d D:\Student\2012\user.name\servername
rmdir student

e assim se livrar da recursão.

Cristian Lupascu
fonte
Nenhum dos diretórios são links simbólicos, verifiquei o primeiro par e o outro no "final", onde fica preso.
11388InfixInput
2

É possível que quem estava trabalhando nessa pasta consiga criar um ponto de junção que faça um loop de volta user.namepara servername, criando assim uma árvore de diretórios 'loop infinito'.

As junções são um recurso do sistema de arquivos NTFS que permite criar um link simbólico para um diretório que opera como um alias para o diretório. http://en.wikipedia.org/wiki/NTFS_junction_point

Você pode ver na seção "Efeitos observados" da página wiki o problema que você descreve.

Tente executar este utilitário para listar junções nesse servidor:

http://technet.microsoft.com/en-us/sysinternals/bb896768

Também deve permitir a exclusão do ponto de junção.

Justin Pearce
fonte
2

Eu tive um problema semelhante quando o eclipse criou uma árvore de pastas massivamente profunda que não consegui excluir. No entanto, como era possível mover e renomear pastas, escrevi um arquivo em lotes para trabalhar. Para uma árvore de pastas aparentemente infinitamente profunda de FOLDERNAME no diretório C, ou seja,

C:/*FOLDERNAME*/*FOLDERNAME*/*FOLDERNAME*/*FOLDERNAME*/*FOLDERNAME*/*FOLDERNAME*/...

Arquivo em lote:

:LoopStart
REN "C:/*FOLDERNAME*" "*TEMPFOLDERNAME*"
MOVE "C:/*TEMPFOLDERNAME*/*FOLDERNAME*" "C:/"
RMDIR /S /Q "C:/*TEMPFOLDERNAME*"
GOTO LoopStart
:LoopEnd

Isso funciona porque o TEMPFOLDERNAME agora é uma árvore de tamanho finito (uma única pasta sem nada) e a enorme árvore FOLDERNAME tem uma pasta a menos toda vez que o loop é executado, chegando finalmente ao fundo, removendo uma pasta na parte superior.

JohnO
fonte
1

Corri para o mesmo problema com uma confusão de pastas com mais de 5000 diretórios que algum aplicativo Java fez e escrevi isso:

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

Ele removeu a coisa toda 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
1

Resolvi meus diretórios de loop infinito com este script:

:LoopStart
takeown /F "c:\temp\Application Data"
Attrib -S -H "c:\temp\Application Data"
REN "C:\temp\Application Data" "5"
takeown /F "c:\temp\5\Application Data"
Attrib -S -H "c:\temp\5\Application Data"
MOVE "c:\temp\5\Application Data" "C:\temp"
Del /F /S /Q c:\temp\5\*.*
RMDIR /S /Q "C:\temp\5"
GOTO LoopStart
:LoopEnd
Schollbert
fonte
0

Eu tive o mesmo problema. A pasta que eu queria excluir continha uma árvore interminável de links com o mesmo nome e cada tentativa de excluí-la fazia com que o Windows lançasse um erro "Arquivo muito longo ...". Ele falhou independentemente do comando que eu tentei, incluindo todos os métodos acima, então tentei o comando "rm" do Cygwin em uma janela do cmd logo acima da pasta em questão. Eu digitei "rm -r -f [folder]" e a pasta foi excluída sem reclamar.

Você pode fazer o download gratuito do Cygwin em https://cygwin.com/install.html . É basicamente um shell UNIX para Windows que contém todos os comandos comuns (por exemplo, ls, rm, du e cat), mas também possui uma tonelada de pacotes que, se todos foram baixados, ocupariam cerca de 1 GB de espaço. Eu acredito que o pacote de download padrão inclui os comandos UNIX. Caso contrário, eles estão no pacote "utils" se a memória servir.

NOTA: Você não precisa executar os comandos do Cygwin em sua janela nativa do bash shell. Eles podem ser executados em uma janela do cmd adicionando o caminho ao diretório "bin" do cygwin à variável de ambiente PATH do sistema. No meu caso, adicionei "C: \ cygwin64 \ bin".

Eu espero que isso ajude.

Cal
fonte
0

Eu tenho o mesmo problema aqui.

Em outras postagens, sugeriu-se espelhar uma pasta vazia para segmentar a pasta através do compartilhamento de rede com o MS RoboCopy.

No momento certo, estou executando isso, com "> nul" para acelerar (na verdade):

"C: \ TEMP" é uma pasta vazia e "W: \ TMP" é a pasta afetada :

robocopy / mir c: \ temp \ 127.0.0.1 \ w $ \ tmp> nul

davidmarquesneves
fonte
11
Bem-vindo ao superusuário. Se você está citando uma solução de outro lugar, inclua a atribuição e um link para ler mais. As respostas pretendem ser soluções definitivas. Se você ainda está tentando fazer isso, pode ser prematuro postar.
fixer1234
0

Eu também tive isso, em um sistema Windows 10 independente. C: \ Usuário \ Nome \ Repita \ Repita \ Repita \ Repita \ Repita \ Repita \ Repita aparentemente até o infinito.

De acordo com o OP, eu poderia navegar usando o Windows ou o Prompt de Comando até o 50º e não mais. Não pude excluí-lo ou clicar nele, etc. exatamente como descrito.

C é a minha linguagem e, por fim, escrevi um programa com um loop de chamadas do sistema, que se repetem até que falhem. De acordo com o código DOS do JohnO, criei um diretório chamado tmp e movi Repeat \ Repeat para ele, excluí a pasta Repeat agora vazia e movi tmp \ Repeat novamente para a pasta atual. Repetidamente!

 while (times<2000)
 {
  ChkSystem("move Repeat\\Repeat tmp");
  ChkSystem("rd Repeat");
  ChkSystem("move tmp\\Repeat Repeat");
  ++times;
  printf("Removed %d nested so far.\n", times);
 }

O ChkSystem apenas executa uma chamada system () e verifica o valor de retorno, parando se falhar.

Importante, falhou várias vezes. Eu pensei que talvez meu programa não estivesse funcionando, ou que fosse infinitamente longo, afinal. No entanto, eu já tive isso antes com chamadas do sistema, com as coisas não sincronizando, então eu apenas executei o programa novamente e ele continuou de onde parou, portanto, não pense que seu programa não está funcionando. No total, depois de executá-lo cerca de 20 vezes, limpou todos eles. No total, havia cerca de 1280 pastas originalmente. Não faço ideia do que causou isso. Louco.

DenM
fonte
0

Com diretórios de loop de três níveis:

:LoopStart
takeown /F "D:\temp\MyApp"
Attrib -S -H "D:\temp\MyApp"
REN "D:\temp\MyApp" "5"
takeown /F "D:\temp\5\MqttObserver"
Attrib -S -H "D:\temp\5\MqttObserver"
REN "D:\temp\5\MqttObserver" "6"
takeown /F "D:\temp\5\6\PackageFiles"
Attrib -S -H "D:\temp\5\6\PackageFiles"
REN "D:\temp\5\6\PackageFiles" "7"
MOVE "c:\temp\5" "C:\temp"
Del /F /S /Q c:\temp\5\*.*
RMDIR /S /Q "C:\temp\5"
MOVE "c:\temp\6" "C:\temp"
Del /F /S /Q c:\temp\6\*.*
RMDIR /S /Q "C:\temp\6"
MOVE "c:\temp\7" "C:\temp"
Del /F /S /Q c:\temp\7\*.*
RMDIR /S /Q "C:\temp\7"
GOTO LoopStart
:LoopEnd
JMi
fonte
Explicação para acompanhar o código? <:: ;; :: ;; :: ;; :: ;;: :( | XXXX |) o ~
Pimp Juice IT
0

Eu o corrigi executando o chkdsk / f através do console de administração, reiniciei e usei a exclusão do explorador de arquivos. Embora o Windows tenha se queixado de alguma coisa sobre o arquivo / pasta longo, ele se livrou da pasta recursiva problemática quando confirmei a exclusão.

Não tenho certeza se existem outros problemas que eu possa ter criado usando a opção chkdsk antiga no meu sistema de arquivos do Windows 7 Pro.

Laks
fonte
0

Para mim, essa variação do método Windows RoboCopy funcionou:

mkdir c:\empty
robocopy c:\empty toolongdir /purge
rmdir c:\empty
rmdir toolongdir

Sim, leva tempo, mas fez o trabalho.

Dimitar II
fonte
-1

Basta executar o MS ROBOCOPY da seguinte maneira:

  1. Crie uma "pasta vazia" com o mesmo nome que a pasta que contém a "árvore de diretórios infinitamente recorrente".
  2. Execute o ROBOCOPY na linha de comandos com a opção / MIR.
  3. Depois que o ROBOCOPY termina (e pode levar alguns segundos),
  4. Exclua a pasta com a "árvore de diretórios infinitamente recorrentes", que agora é uma "pasta vazia".
  5. Também vá em frente e exclua a "pasta vazia" criada na Etapa 1.

. . . . . . . . . . . . . . .

ROBOCOPIA "C: \ anyplace \ BADFOLDER" "C: \ where \ BADFOLDER" / MIR

Onde:

C: \ anyplace \ BADFOLDER .. é a "pasta vazia" que você criou e

C: \ where \ BADFOLDER .. é a pasta onde está a "árvore de diretórios infinitamente recorrentes".

. . . . . . . . . . . . . . .

Após a execução do ROBOCOPY. Agora você tem dois PADRÕES "vazios".

Para limpar, exclua os dois

C: \ anyplace \ BADFOLDER e C: \ where \ BADFOLDER

R. Serpkenci
fonte