Как удалить папку, которая вложена достаточно глубоко и избежать «Имя файла слишком длинное»?

70

Eclipse создал временную папку в одной из директорий, которая достаточно глубоко вложена, например

dir1\dir1\dir1\dir1\...

Я не могу удалить эту папку в Windows с помощью проводника, команд delor rmdirили Cygwin 'rm'. Как мне удалить эту очень длинную папку?

Он просто продолжает говорить "Имя файла слишком длинное ..."

user39186
источник

Ответы:

105

Если вы похожи на меня и не любите устанавливать дополнительное программное обеспечение для решения такой проблемы, я бы воспользовался предложением XQYZ и использовал его robocopyдля решения этой проблемы. (В моем случае проблема была создана в первую очередь с помощью robocopy, скопировав каталог с рекурсивными точками соединения без предоставления / XJ для robocopy).

Чтобы удалить дерево каталогов, начинающееся с c: \ subdir \ more \ Offnding_dir :

Весь пошаговый процесс так же прост:

  1. cd c:\subdir\more перейти в родительский каталог.
  2. mkdir empty создать пустой каталог.
  3. robocopy empty offending_dir /mir зеркалировать пустой каталог в оскорбительный.
  4. После некоторого ожидания все готово! Завершите это с:
  5. rmdir offending_dir чтобы избавиться от теперь пустого оскорбительного каталога и
  6. rmdir empty чтобы избавиться от вашего промежуточного пустого каталога.
jofafrazze
источник
2
Отличное предложение. Моя проблема была также создана с помощью robocopy, и, как вы описали, исправление robocopy сработало для меня.
Натан Гарабедян
3
Я также сделал беспорядок robocopyи точки соединения; спасибо, что показали мне, как использовать это, чтобы навести порядок!
Мистер Волшебник
мои папки не были созданы robocopy, но он удалил их отлично
Саша
11
Менеджер пакетов узлов (NPM) вызвал эту проблему для меня. По какой-то причине было так много вложенных пакетов.
Дэвид Шеррет
это, безусловно, лучший и самый разумный ответ, намного лучше, чем индивидуальный рекурсивный пакетный сценарий
монашеская паника
39

Это на самом деле довольно просто исправить. Скажем, что структура каталогов такова:

C:\Dir1\Dir1\Dir1\Dir1…

Чтобы исправить это, просто переименуйте каждую папку в одно-символьное имя папки, пока она не станет слишком длинной для удаления:

  1. Переименовать C:\Dir1вC:\D
  2. Перейдите к C:\D\
  3. Переименовать C:\D\Dir1вC:\D\D
  4. Перейдите к C:\D\D\
  5. Переходите к 1, пока общая длина пути не станет <260

Вот пакетный файл для автоматизации процесса (эта простая версия лучше всего подходит для простых каталогов, подобных описанным в вопросе, особенно для одноразовых). Передайте ему максимально возможную папку (например, C:\Dir1для C:\Dir1\Dir1\Dir1…или C:\Users\Bob\Desktop\New Folderдля 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

Техническое объяснение

Другие предлагаемые решения являются обратными; вы не можете это исправить, прокладывая себе путь из самой внутренней директории наружу, вам нужно идти в другом направлении.

Когда вы пытаетесь получить доступ к каталогу, вы делаете это, используя его абсолютный путь, явно или нет, который включает в себя все, что было до него. Следовательно, для такой структуры каталогов C:\Dir1\Dir1\Dir1\Dir1длина пути до самого внутреннего Dir1равна 22. Однако длина пути до самого внешнего Dir1составляет всего 7, и поэтому все еще доступна независимо от ее содержимого (в контексте пути данного каталога файловая система не знает, что она содержит, или как она влияет на общую длину пути своих дочерних каталогов, только каталоги-предки - вы не можете переименовать каталог, если общая длина пути будет слишком большой).

Поэтому, когда вы сталкиваетесь с слишком длинным путем, вам нужно перейти на максимально возможный уровень, переименовать его в односимвольное имя и повторить для каждого уровня в нем. Каждый раз, когда вы это делаете, общая длина пути сокращается на разницу между старым именем и новым именем.

Обратное также верно. Вы не можете создать путь, который больше максимальной поддерживаемой длины (в DOS и Windows, MAX_PATH = 260). Тем не менее, вы можете переименовать каталоги, работая изнутри наружу, в более длинное имя. В результате более глубокие папки, абсолютный путь которых> 260, будут недоступны. (Это не делает их «скрытыми» или безопасными, поскольку к ним достаточно просто добраться, поэтому не используйте этот метод для скрытия файлов.)


Интересная сторона Примечание

Если вы создаете папки в Windows 7 Explorer, может показаться, что Explorer позволяет вам создавать подкаталоги так, чтобы общая длина была больше, чем MAX_PATHфактически, но фактически она обманывает, используя «имена файлов DOS 8.3». Вы можете увидеть это, создав дерево, например:

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

Его длина составляет 696 символов, что, конечно, намного больше, чем 260. Кроме того, если вы переходите к самому внутреннему подкаталогу в Проводнике, он показывает его, как и ожидалось, в адресной строке, когда он не в фокусе, но когда вы щелкаете по адресу бар, он меняет путь C:\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\, длина которого составляет всего 102 символа.

В XP он этого не делает, вместо этого он решительно отказывается создавать более длинный путь, чем поддерживается.

Что было бы действительно интересно, так это узнать, как Windows 7 Explorer обрабатывает «слишком длинные пути», когда эта NtfsDisable8dot3NameCreationопция установлена.

Synetech
источник
3
Это является возможным , чтобы создать путь длиннее , чем MAX_PATH, как описано здесь . К сожалению, \\?` doesn't work with rmdir`.
grawity
@ grawity, да, но это потому, что он работает по тому же принципу: короткий путь переименовывается в более длинный; он просто делает это динамически, расширяя переменную, а не переименовывая ее вручную в первую. Невозможно создать каталог, чей абсолютный путь слишком длинный, когда команда создания имеет достаточно информации для определения общей длины.
Synetech
3
@Synetech: Нет, это работает по-другому. Пути вроде \\?\C:\dir\dir\dir\dirбуквально обходят MAX_PATH; здесь нет никаких «переменных». (Но, как я уже сказал, по какой-то причине он не работает с rmdirдругими cmd.exeвстроенными
функциями
Например, попробуйте запустить. md C:\01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Это не будет работать, потому что файловая система имеет достаточно информации, чтобы определить, что общая длина пути будет 263 символа, поэтому она не работает.
Synetech
2
(Кроме того, не путайте длину пути с длиной компонента . У вас не может быть одного каталога с именем длиной более 255 символов; однако, вы можете иметь путь намного более длинный, чем этот.)
grawity
17

Вы можете сократить путь, используя substдля создания виртуального диска:

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

Перейдите на виртуальный диск:

cd Z:

Теперь вы можете удалить файлы:

del *.*

Удалить виртуальный диск:

cd C:\TEMP
subst Z: /d

Удалить каталог:

rd /s dir1
Мэтью Симоне
источник
Нет; эта первая команда не будет работать, если каталог слишком длинный; он вернет ошибку Неверный параметр .
Synetech
2
@Synetech, конечно, но если вы подставите просто C:\TEMP\dir1\dir1\dir1, то он сократит часть этого, что позволит вам войти. Это похоже на ваше предложение переименовать, но вместо этого с отображением. ;)
Бобсон
@ Бобсон, хорошо, ты прав; +1 для вас обоих. :-)
Synetech
10

Я написал небольшое приложение на C #, чтобы помочь мне удалить похожую очень глубокую структуру, созданную небрежным использованием Robocopy и резервной копии с Homeserver; по умолчанию Robocopy рассматривает точки соединения как обычные папки ... :-( Вы можете получить большой беспорядок, не заметив этого.

Этот инструмент доступен на CodePlex с исходными файлами для любого пользователя.

http://deepremove.codeplex.com

JPJofre
источник
РАБОТАЕТ!!! Этот ответ должен быть помечен как рабочий! Программное обеспечение работает как масло .. решил мою проблему в течение нескольких секунд! Спасибо!
Рафик Мохаммед
7

Некоторое время назад я создал небольшой автономный исполняемый файл утилиты с именем DeleteFiles , который можно легко использовать для выполнения этой задачи.

Используя эту автономную утилиту, вы можете просто:

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

удалить всю структуру папок. -r возвращает иерархию папок из начального каталога вниз, -f удаляет все пустые папки (которые будут всеми, если вы будете использовать . как спецификацию файла). DeleteFiles поддерживает пути длиннее, чем ограничение Windows MAX_PATH, поэтому он будет отлично работать с глубоко вложенными папками.

DeleteFiles является бесплатным и открытым исходным кодом, и вы можете получить бинарный или исходный код из GitHub или установить непосредственно с помощью Chocolatey

Рик Страл
источник
Спасибо, замечательный инструмент, ++ для того, чтобы положить его в шоколаде;) Позволяет легко интегрировать в инструмент CI!
Чарльз Оуэлл
1
Это добилось цели. Если у вас очень длинный путь, добавление > NULв конец может ускорить процесс.
ryscl
Решение Robocopy не работает ни для меня, ни для решения Synetech. У меня работал DeleteFiles, но по какой-то причине мне пришлось запустить его три раза, чтобы все подпапки были удалены. В любом случае это решило мою проблему.
Франк
Re: запуск DeleteFiles 3 раза. Я также видел это - я полагаю, что это связано с некоторыми причудами Windows, которые блокируют папки с файлами в них на короткое время даже после удаления файлов. Многократные проходы улавливают случайный сбой этой проблемы в подпапках - потенциально многоуровневых. Я вижу такое же поведение при удалении проводника из глубоких деревьев.
Рик Страл
5

Просто и легко сейчас

я сталкивался с этой же проблемой, так как долго с node_modules, которые очень вложенные папки. поэтому, наконец, сделал скрипт для исправления того, что может удалять папки путем сокращения путей.

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

npm install fdel -g

fdel ./node_modules
dev.meghraj
источник
Я не знаю, почему дизайнеры решили включить каждую зависимость в структуру, когда они могли бы сделать это с плоской структурой. Так что этот сценарий был для меня самым простым, так как я уже использую node.js
user2610529
4

Во время работы с Sikuli меня задело рекурсивным циклом Calculator.sikuli в программе, которая создала бесчисленное количество каталогов «calculator.sikuli.calculator.sikuli». Я мог бы переместить дерево, но путь слишком длинный для удаления.

Перепробовав несколько решений с помощью popd loop, Scandisk и ничего (заметно) не получилось ....

Я написал этот сценарий, чтобы «углубиться» в повторяющиеся каталоги (в каталог с именем «a»), переместить их (в каталог с именем «b»), затем удалить усеченное дерево, переместить их обратно (в «a») и повторите:

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 Используется для удаления бесконечно рекурсивных подпапок.
  • REM предлагает сначала остановить службу поиска Windows (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

Это просто вызов для повторного запуска командного файла.

SiloSix
источник
Я часами изучал это. Этот файл .bat похож на подарок с небес. Ты, силос, ангел. xD
Squish
2

У нас была такая проблема на работе, когда Eclipse решила создать мусор на жестких дисках. Мы исправили это, используя функцию Robocopy / MIR для зеркалирования пустого каталога во вложенный.

XQYZ
источник
1

Я бы попробовал открыть командную строку и запустить:

rmdir /s <directory>

Если это не сработает, я частично зайду в дерево каталогов и попытаюсь удалить подмножество каталогов - скажем, 20 самых внутренних каталогов - и затем оттуда выхожу.

Джесси С.
источник
1
Я попробовал ваше предложение выше, и оно по-прежнему говорит: «Каталог не пустой», когда я запускаю вышеупомянутую команду на нескольких уровнях
user39186
1
Это потому, что этот метод задом наперед. ;-)
Synetech
1

Если это сетевая папка, просто поделитесь родительским каталогом этого каталога и сопоставьте его с диском на вашем локальном компьютере, а затем удалите вашу папку.

Punnakadu
источник
21966 [main] mv 1288 D: \ work \ software \ cygwin \ bin \ mv.exe: *** Неисправность - внутренняя ошибка чтения среды Windows - слишком много переменных среды?
user39186
Я попытался переместить вложенную папку на глубину 20 уровней и получил вышеуказанную ошибку
user39186
1

Откройте командную строку.

Перейдите к папке / каталогу, который содержит самый высокий 'dir1' (предположим, C: \)

c:\> RD /s dir1

Изменить (после добавления комментариев) :

Другие идеи:

MS предлагает информацию о том, как решить проблему (множество идей, чтобы попробовать) здесь .

Также есть этот инструмент (никогда не использовал его лично) - TooLongPath .

Возможно, напишите что-нибудь (поскольку у вас есть Eclipse), которое полностью перемещается, а затем откатывает назад по одному уровню папок за раз, удаляя по ходу дела?

Ƭᴇcʜιᴇ007
источник
1
Я получаю следующие 3 ошибки при использовании вышеупомянутой команды. Каталог не пуст. Системе не удается найти указанный путь. Имя файла слишком длинное
user39186
Я попытался пройти, скажем, 'n' уровней глубоко, и попытался использовать ту же команду, но, похоже, это не помогло
user39186
это работало для меня на win7! спасибо
leoh
1

Другое решение: иди скачай Total Commander. Это очень полезная программа, не только потому, что она знает длинные имена файлов.

Незарегистрированная версия - nagware, но полностью функциональная, она сделает свою работу.

Лорен Печтель
источник
1

Это можно сделать непосредственно из командной строки или в пакетном файле, создав UNC-путь к каталогу, который вы хотите удалить.

так вместо

rmdir /s/q c:\mydirectory

использование

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

Такие пути в стиле UNC могут быть намного длиннее и обходить ограничение в 260 символов.

Стив Купер
источник
Не работает 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 64-битная.
Виктор,
Не работает для Windows 10. Все еще слишком долго.
BananaAcid
Версия `\\?` Работала для меня на Windows 10!
Питер
0

Когда у меня возникает эта проблема, я просто переименовываю некоторые имена папок намного короче, а затем, когда общий путь становится достаточно коротким, он удаляет OK. Никаких дополнительных инструментов не требуется.

music2myear
источник
Да, но, как я уже сказал, вам нужно работать извне, иначе это не сработает.
Synetech
Конечно. Как правило, я обнаружил, что самые длинные имена папок бывают первыми (в папках патчей) или последними. В большинстве случаев вам нужно всего лишь изменить одно или два имени папки, чтобы получить нужную длину.
music2myear
Да, но если вы начнете с самого внутреннего, он не будет работать, потому что renкоманда не удастся path too long.
Synetech
1
Да, приведенные выше сценарии - это умный и эффективный метод автоматического решения этой проблемы. Это случалось со мной всего несколько раз, и я просто использовал процесс ручного переименования. Для этого я просто начинаю переименовывать структуру папок, где бы я ни находился, в дереве-нарушителе, и мой опыт показывает, что самые длинные имена папок чаще появляются в начале или в конце древовидной структуры. Поэтому мой ответ правильный, хотя, возможно, не самый сильный и не самый умный здесь. Это не стоит понижать голос.
music2myear
> Я просто начинаю переименовывать структуру папок, где бы я ни находился в дереве-нарушителе. Ну, да, если вы уже внутри дерева, то вы, конечно, можете переименовать хотя бы эту папку (вам нужно перейти к ее родителю) ; Вы также можете переименовать подпапку, но это может быть слишком долго.
Synetech
0

У меня была та же проблема, за исключением того, что она была создана рекурсивной задачей Cobian Backup. Я выяснил, что бесплатное программное обеспечение Cobian включает приложение Deleter, которое может легко и быстро быстро удалить эти надоедливые вложенные папки.

Он расположен под меню инструментов.

mrshl
источник
0

Я столкнулся с той же проблемой с беспорядком папки более 5000 каталогов, что и некоторые Java-приложения, и я написал программу, которая поможет вам удалить эту папку. Весь исходный код находится по этой ссылке:

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

Через некоторое время все это удалилось, но удалось справиться со своей задачей, я надеюсь, что это поможет людям, которые (как и я) сталкиваются с одной и той же неприятной проблемой.

Иманол Барба Сабариего
источник
-3

Ваша файловая система может быть повреждена. Запустите chkdsk, чтобы увидеть, восстанавливает ли он что-либо, затем попробуйте удалить папку.

жонглер
источник
Нет, это не проблема. Проблема в том, что общая длина пути больше, чем поддерживается ( MAX_PATH=255). Это может произойти даже с не поврежденной файловой системой.
Synetech
Запуск chkdsk в папке дал мне следующую ошибку.
Неверный