Forçar a exclusão de arquivos com um nome bastante grande

62

Uso regularmente o Node.js para gerenciar dependências de programas que escrevo, não é grande coisa. Hoje acabei com uma estrutura de pastas assim:insira a descrição da imagem aqui

A tentativa de excluir qualquer arquivo foi recebida com este erro:

Os nomes dos arquivos de origem são maiores do que os suportados pelo sistema de arquivos. Tente mudar para um local com um nome de caminho mais curto ou renomeie para nomes mais curtos antes de tentar esta operação.

Já estava em C: \, então não ia ficar muito mais curto.

Seiyria
fonte
você tem alguma idéia de como sua estrutura de pastas ficou tão grande que me deparei com a mesma situação ao instalar o grunhido.
eran otzer
11
@eranotzer usando npm.
Seiyria
Eu não fiz as dependências em seus packages.json onde escritas incorretamente?
eran otzer
@eranotzer Sim. Por causa de como o npm @ 2 funcionava, todas as dependências aninhavam suas dependências dentro dele. Isso significava que as cadeias de dependência poderiam ser arbitrariamente longas. O npm @ 3 está olhando para ajustar esse comportamento.
Seiyria

Respostas:

75

Use a ferramenta Microsoft robocopy.exe.

  1. Crie uma nova pasta vazia, por exemplo c:\empty
  2. Em seguida, copie a pasta vazia na pasta que contém os nomes de arquivos longos que você está tentando excluir, por exemplo c:\myannoyingfolder. Faça o seguinte no prompt de comando:

    robocopy / MIR c: \ vazio c: \ myannoyingfolder

Flo
fonte
Como isso faz parte do meu fluxo de trabalho com bastante frequência, descobri como integrá-lo ao shell do Windows. Veja minha resposta abaixo. :)
toddmo
Nota: este comando pode levar alguns segundos ou até minutos para terminar. Então, não se preocupe e deixá-lo fazer o :-) mágica
Adil Malik
Obrigado, trabalhou para mim. Eu tinha que ter certeza de que também matei qualquer processo (IIS) que ainda estava segurando um dos arquivos.
Slick Shinobi:
Sempre que tento abrir o robocopy.exe, uma janela pisca por um segundo e nada acontece. Por favor ajude
Maulik Modi
29

ok, digamos que você queira excluir uma árvore D:\very\long\path, não precisa necessariamente usar nenhuma ferramenta como o Robocopy.

  1. Vá para o diretório raiz da unidade que contém o diretório que você não pode excluir
  2. Crie um diretório com um único nome de letra, por exemplo D:\a
  3. Navegue para dentro do diretório que você deseja excluir, neste caso D:\very\long\path
  4. Selecionar tudo ( Ctrl+ A) e Cortar ( Ctrl- X)
  5. Navegue até a pasta que você acabou de criar
  6. Colar ( Ctrl- V)
  7. Agora, vá para o diretório raiz e exclua a pasta temp, nesse caso D:\a
  8. Em seguida, volte e exclua o diretório original
gd73
fonte
2
Isso não funcionou para mim na primeira tentativa para mim. No entanto, depois de repetir esse procedimento, mais alguns níveis de pasta consegui excluir tudo.
abaldwin99
11
Ótima solução, funcionou perfeitamente. Simples e eficaz, obrigado!
Caner Öncü
ÓTIMO!! Funciona como um encanto!!! nenhuma outra ferramenta é necessária. Obrigado!
Prasanth KC
Isso funciona muito bem, e eu acrescentaria um ponto a isso: se a seleção de arquivos do caminho não funcionar, você pode selecionar uma pasta em algum lugar no meio do caminho longo e movê-la para uma pasta temporária e excluir ambos de maneira semelhante.
Narayana Nagireddi
4

Comecei a digitar esse problema ao tentar vários comandos, incluindo del /Fe rmdir /S(além de manter a tecla Shift pressionada ao excluir para tentar ignorar a lixeira). Eu acho que, rmdir /Sna verdade, excluí todos os arquivos, então pude prosseguir com a exclusão das pastas que eram nós de folhas e, em seguida, progredindo na árvore alguns nós de cada vez. Eventualmente, eu limpei todos eles, mas isso era ridículo.

Seiyria
fonte
4

Você pode integrar essa funcionalidade ao shell do Windows. Meu aprimoramento na resposta de Flo foi muito longo para um comentário.

Eu adicionei um Deletecomando ao menu de contexto do Windows.

insira a descrição da imagem aqui

O delete.regarquivo adiciona entradas do Registro para associar pastas ao robodelete.batarquivo em lotes.

delete.reg

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\Delete]

[HKEY_CLASSES_ROOT\Directory\shell\Delete\command]
"Extended"=""
@="\"D:\\Documents\\robodelete.bat\" \"%1\""

robodelete.bat

mkdir c:\empty
robocopy /MIR c:\empty %1
rmdir %1
rmdir c:\empty

Nota : Pode ser necessário alterar os caminhos nos dois arquivos conforme suas preferências.

AVISO : Não há como desfazer este comando. Ele não usa a lixeira e não pede que Y / N confirme antes de destruir a pasta para sempre!

toddmo
fonte
Obrigado pelo aviso. Também preciso disso no meu fluxo de trabalho, mas gostaria de evitar um botão nuclear no menu do botão direito que não possui confirmação de S / N. Se eu tiver tempo, tentarei fazer esse ajuste e sugiro uma edição.
abaldwin99
11
@ abaldwin99, como este, talvez stackoverflow.com/a/1807318/1045881
toddmo 28/09/15
4

A ferramenta de linha de comando de código aberto SuperDelete ( GitHub ) funcionou para mim depois que outras opções falharam (Windows 10).

Joshua Fox
fonte
3

A melhor maneira de fazer isso é usar a robocópia. Eu a documentei no meu blog pessoal para você seguir:

http://clintboessen.blogspot.com.au/2014/05/how-to-delete-files-which-exceed-255.html

Clint
fonte
4
Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada ou desaparecer.
197 Andrea Andrea
0

Em muitos casos, o CD no diretório a partir de um prompt de comando e o uso do DEL funcionarão.

Caso contrário, você deve trabalhar seu nome na árvore de diretórios: renomeie a pasta de nível mais baixo para um nome mais curto (por exemplo, "a"), depois o próximo nome de pasta mais alto e assim por diante, até que o caminho total seja curto o suficiente. Ao trabalhar de baixo para cima, você sempre manipula nomes com um caminho completo mais curto que os arquivos finais.

Eugen Rieck
fonte
0
  • Abrir prompt de comando administrativo
  • net use z: c:\path
  • del z:\*.*

Ajustar de acordo. Z: é apenas uma letra de unidade arbitrária para a qual mapear o caminho incorreto. Esse último comando de exclusão apagará o diretório INTEIRO que você mapeou - portanto, seja mais específico conforme necessário.

Bradley Forney
fonte
2
Isso é muito perigoso para usuários não-avançados! Existe o potencial de limpar uma unidade se isso for feito errado.
Rudi Strydom
Concordo 100%. Definitivamente, prossiga com cautela neste.
Bradley Forney
0

A melhor maneira é ter o Linux inicializável no pendrive e excluir arquivos sem problemas nos sistemas operacionais de CD ao vivo .

Dariusz Filipiak
fonte
-1

Eu também tive o mesmo problema, e eu mesmo o encontrei, simplesmente renomeie a pasta pai o menos possível. Ex. Se a nossa pasta na unidade " D " for como D: // Folder / Undelete_Folder . Apenas uma coisa que você precisa fazer é renomear o nome da pasta pai tão pequeno quanto você pode renomeá-la " a ". sua localização será D: // a / Undelete_folde r. e exclua a pasta pai.

Rohit R
fonte
Não apenas isso não necessariamente funciona (e se ainda for maior, mesmo com a redução?), Mas mencionei explicitamente que minha pasta estava na raiz da unidade.
Seiyria
-2

Se todo o resto falhar

Vá para o diretório final na string. Recortar os arquivos Cole novamente no 4º ou 5º arquivo da String. Então [Shift] + [Delete] deve executar o truque.

Fiquei cético ao executar o acima no prompt de comando elevado, pois estava excluindo um arquivo de restauração de teste de um backup do DPM.

espero que isto ajude.

Andre
fonte
Provavelmente, isso não funcionará porque eles ainda terão esse longo caminho de arquivo para a operação de corte.
Seiyria