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

8

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

Você acaba com algo assim:

D:\Student12\user.name\servername\student12\user.name\servername\student12\...

E continua infinitamente até onde eu sei dizer.

Tentando excluir a árvore de diretórios do sistema, ela reside nos resultados em "Erro ao excluir o arquivo ou a 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 até a árvore de diretórios até chegar a um diretório que não pode ser aberto ou excluído (se clicar com o botão direito em nenhuma das opções padrão), se você tentar abrir o mesmo diretório de um compartilhamento em outro sistema, ele pode ser aberto, mas o Windows Explorer fica extremamente lento.

Eu tentei as sugestões em este post, bem como inicializar o servidor com um disco Linux e tentar rm -rf o diretório, nem funcionou.

É um mistério.

Edit: Também devo acrescentar que é possível renomear os diretórios, mas não removê-los.

    
por EnglishInfix 24.04.2012 / 21:51

11 respostas

10

Eu também tinha uma pasta infinitamente recursiva que havia sido criada por um IDE java, e não consegui excluí-la no Windows Explorer nem 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 ele vai cuidar disso.

    
por 04.02.2017 / 01:08
3

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

Tente executar o comando:

dir D:\Student12\user.name\servername

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

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

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 há JUNCTION s em vez de SYMLINK s.

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

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

e, assim, livrar-se da recursão.

    
por 24.04.2012 / 22:22
2

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

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. link

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

Tente executar este utilitário para listar as junções sob esse servidor:

link

Ele também deve permitir excluir o ponto de junção.

    
por 24.04.2012 / 22:22
2

Eu tive um problema semelhante quando o eclipse criou uma árvore de pasta maciçamente profunda que eu não poderia excluir. No entanto, desde que foi possível mover e renomear pastas eu escrevi um arquivo em lotes para trabalhar é caminho para baixo a árvore de exclusão de pastas de uma vez e isso funcionou! Para uma árvore de pastas aparentemente infinitamente profunda de FOLDERNAME no diretório C, por exemplo

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 possui uma pasta a menos toda vez que o loop é executado, chegando ao final removendo uma pasta no topo .

    
por 17.05.2012 / 15:31
1

Eu me deparei com o mesmo problema com uma pasta de pasta com mais de 5000 diretórios que alguns aplicativos Java fizeram e escrevi isso:

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 08.08.2015 / 20:39
1

Resolvi meus diretórios infinitos de looping 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\Application Data"
Attrib -S -H "c:\temp\Application Data"
MOVE "c:\temp\Application Data" "C:\temp"
Del /F /S /Q c:\temp\*.*
RMDIR /S /Q "C:\temp"
GOTO LoopStart
:LoopEnd
    
por 10.01.2017 / 19:05
0

Eu tive o mesmo problema. A pasta que eu queria excluir continha uma infinita árvore de links para o mesmo nome e todas as tentativas de deletá-lo fizeram com que o Windows lançasse um erro "Arquivo muito longo ...". Ele falhou, independentemente do comando Eu tentei incluindo todos os métodos acima então eu tentei o comando "rm" do Cygwin em uma janela cmd logo acima da pasta em questão. Eu digitei "rm -r -f [pasta]" e a pasta foi excluída sem reclamação.

Você pode fazer o download do Cygwin gratuitamente pelo link . É basicamente um shell UNIX para Windows que contém todos os comandos comuns (por exemplo, ls, rm, du e cat), mas também tem uma tonelada de pacotes que, se todos fossem baixados, ocupariam cerca de 1 GB de espaço. Eu acredito que o pacote de download padrão inclui os comandos do UNIX. Se não, 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 cmd, adicionando o caminho ao diretório "bin" do cygwin à variável ambiental PATH do seu sistema. No meu caso eu adicionei "C: \ cygwin64 \ bin".

Espero que isso ajude.

    
por 03.05.2016 / 20:01
0

Eu tenho o mesmo problema aqui.

Em outros posts foi sugerido para espelhar uma pasta vazia para a pasta de destino através do compartilhamento de rede com o MS RoboCopy.

Neste exato momento eu estou correndo isso, com "> nul" para acelerar (isso acontece, na verdade):

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

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

    
por 09.08.2016 / 03:20
0

Eu também tive isso, em um sistema autônomo do Windows 10. C: \ Usuário \ Nome \ Repetir \ Repetir \ Repetir \ Repetir \ Repetir \ Repetir \ Repetir aparentemente ao infinito.

De acordo com o OP, eu poderia navegar usando o Windows ou o Prompt de Comando para o 50º e não mais. Eu não pude excluí-lo, nem clique nele, exatamente como descrito.

C é minha linguagem, então eventualmente eu escrevi um programa com um loop de chamadas do sistema, que se repetem até falharem. De acordo com o código DOS de JohnO, criei um diretório chamado tmp e movi Repeat \ Repeat, deletei a pasta Repeat agora vazia e movi tmp \ Repeat de volta para a pasta atual. De novo e de novo!

 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 ao sistema () e verifica o valor de retorno, parando se ele falhar.

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

    
por 31.03.2017 / 18:08
0

Com diretórios de looping de 3 níveis:

:LoopStart
takeown /F "D:\temp\MyApp"
Attrib -S -H "D:\temp\MyApp"
REN "D:\temp\MyApp" "5"
takeown /F "D:\temp\MqttObserver"
Attrib -S -H "D:\temp\MqttObserver"
REN "D:\temp\MqttObserver" "6"
takeown /F "D:\temp\PackageFiles"
Attrib -S -H "D:\temp\PackageFiles"
REN "D:\temp\PackageFiles" "7"
MOVE "c:\temp" "C:\temp"
Del /F /S /Q c:\temp\*.*
RMDIR /S /Q "C:\temp"
MOVE "c:\temp" "C:\temp"
Del /F /S /Q c:\temp\*.*
RMDIR /S /Q "C:\temp"
MOVE "c:\temp" "C:\temp"
Del /F /S /Q c:\temp\*.*
RMDIR /S /Q "C:\temp"
GOTO LoopStart
:LoopEnd
    
por 09.12.2017 / 19:39
-1

Basta executar o MS ROBOCOPY da seguinte forma:

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

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

ROBOCOPY "C: \ qualquer lugar \ BADFOLDER" "C: \ onde estiver \ 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 recorrente".

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

Depois que o ROBOCOPY é executado ... Agora você tem dois BADFOLDERS "vazios".

Para limpar, exclua ambos

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

    
por 21.09.2017 / 18:59

Tags