Как удалить бесконечно повторяющееся дерево каталогов?

9

На одном из наших файловых серверов Windows 2003 кто-то или что-то сумел создать бесконечно повторяющиеся деревья каталогов в некоторых из домашних папок пользователей, и они не могут быть удалены.

Вы получаете что-то вроде этого:

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

И это продолжается бесконечно, насколько я могу судить.

Попытка удалить дерево каталогов из системы приводит к появлению сообщения «Ошибка удаления файла или папки: невозможно удалить файл:». Попытка удалить его из системы Windows 7, подключенной к сетевой папке, приводит к ошибке «папка используется».

Если вы перемещаетесь вниз по дереву каталогов, то в конечном итоге вы получаете каталог, который нельзя открыть или удалить (если щелкнуть правой кнопкой мыши, ни один из стандартных параметров не появится), однако, если вы попытаетесь открыть тот же каталог из общего ресурса в другой системе его можно открыть, однако Windows Explorer становится очень медленным.

Я попробовал предложения в этом посте, а также загрузил сервер с диска Linux и попытался найти каталог в rm -rf, но ничего не получилось.

Это загадка

Изменить: Я также могу добавить, что можно переименовать каталоги, но не удалять их.

EnglishInfix
источник
1
Подобная проблема была решена при сбое сервера .
Лилиенталь

Ответы:

14

У меня также была бесконечно рекурсивная папка, созданная java IDE, и я не смог удалить ее ни в проводнике Windows, ни в командной строке cmd.

Однако, когда я установил git, я также установил git-bash. В git-bash вы можете выполнить команду:

rm -rfd recursive_folder_name

и это позаботится об этом.

cdjohnk
источник
Важное примечание: это может занять огромное количество времени ... Сделайте перерыв, съешьте что-нибудь, выпейте кофе, и пусть инструмент Unix сделает свою работу;) Удивительно, но это работает
Antwane
также работает, если использовать Linux на основе VMware и смонтировать диск (если он внешний ...)
Вольфганг Фаль
4

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

Попробуйте выполнить команду:

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

и посмотрите, studentпомечен ли он как DIR или SYMLINK / JUNCTION.

Например, это типичный вывод 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]

Вы видите, что первые две записи помечены как DIR, а третья (символическая ссылка на другую папку) помечена как SYMLINKD. В вашем случае (Windows 2003) я думаю, что есть JUNCTIONs вместо SYMLINKs.

Если studentпапка является символической ссылкой или соединением, выполните команды:

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

и таким образом избавиться от рекурсии.

Кристиан Лупаску
источник
Ни одна из директорий не является символической ссылкой, я проверил первую пару плюс ту, что в конце, где она застряла.
EnglishInfix
2

Вполне возможно, что кто бы ни работал в этой папке, ему удастся создать точку соединения, которая вернется из цикла user.nameв servername, создавая, таким образом, дерево каталогов «бесконечный цикл».

Пересечения - это функция файловой системы NTFS, которая позволяет создавать символическую ссылку на каталог, который действует как псевдоним для каталога. http://en.wikipedia.org/wiki/NTFS_junction_point

В разделе «Наблюдаемые эффекты» на вики-странице вы можете увидеть проблему, которую вы описываете.

Попробуйте запустить эту утилиту, чтобы получить список соединений на этом сервере:

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

Это также должно дать вам возможность удалить точку соединения.

Джастин Пирс
источник
2

У меня была похожая проблема, когда Eclipse создал очень глубокое дерево папок, которое я не мог удалить. Однако, так как было возможно перемещать и переименовывать папки, я написал пакетный файл для работы, он спустился по дереву, удаляя папки по одной за раз, и это сработало! Для очевидно бесконечно глубокого дерева папок FOLDERNAME в каталоге C, т.е.

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

Пакетный файл:

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

Это работает, потому что TEMPFOLDERNAME теперь является деревом конечной длины (одна папка, в которой ничего нет), а в массивном дереве FOLDERNAME каждый раз при запуске цикла появляется на одну папку меньше, в конечном итоге достигнув дна, удалив папку сверху.

Johno
источник
1

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

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

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

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

Решил мои бесконечные циклы каталогов с помощью этого скрипта:

: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
источник
0

У меня такая же проблема. Папка, которую я хотел удалить, содержала бесконечное дерево ссылок на одно и то же имя, и каждая попытка удалить его вызвала ошибку Windows «Файл слишком длинный ...». Это не удалось независимо от команды, которую я пытался включить все вышеупомянутые методы, поэтому я попробовал команду Cygwin «rm» в окне cmd чуть выше рассматриваемой папки. Я ввел «rm -r -f [папка]» и папка была удалена без жалоб.

Вы можете скачать Cygwin бесплатно с https://cygwin.com/install.html . По сути, это оболочка UNIX для Windows, которая содержит все общие команды (например, ls, rm, du и cat), но также имеет массу пакетов, которые, если все они будут загружены, занимают около 1 ГБ пространства. Я считаю, что пакет загрузки по умолчанию включает в себя команды UNIX. Если нет, они находятся в комплекте «utils», если память служит.

ПРИМЕЧАНИЕ. Вам не нужно запускать команды Cygwin в собственном окне оболочки bash. Их можно запустить в окне cmd, добавив путь к каталогу «bin» cygwin в системную переменную среды PATH. В моем случае я добавил "C: \ cygwin64 \ bin".

Надеюсь, это поможет.

Cal
источник
0

У меня такая же проблема здесь.

В других сообщениях было предложено отразить пустую папку в целевой папке через сетевой ресурс с помощью MS RoboCopy.

В этот момент я запускаю это, с "> nul" для ускорения (это действительно так):

«C: \ TEMP» - пустая папка, а «W: \ TMP» - уязвимая папка:

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

davidmarquesneves
источник
1
Добро пожаловать в Супер пользователя. Если вы цитируете решение из другого места, пожалуйста, включите атрибуцию и ссылку для дальнейшего чтения. Ответы предназначены для окончательного решения. Если вы все еще пытаетесь это сделать, отправлять сообщения может быть преждевременно.
fixer1234
0

У меня тоже было это, на автономной системе Windows 10. C: \ User \ Name \ Repeat \ Repeat \ Repeat \ Repeat \ Repeat \ Repeat \ Repeat, по-видимому, до бесконечности.

Что касается OP, я мог перейти с помощью Windows или командной строки примерно на 50-й и не дальше. Я не мог удалить его или щелкнуть по нему и т. Д. В точности так, как описано.

C - мой язык, поэтому в конце концов я написал программу с циклом системных вызовов, которые повторяются до тех пор, пока не завершатся неудачей. Согласно коду DOS от JohnO, я создал каталог с именем tmp и переместил туда Repeat \ Repeat, удалил пустую папку Repeat и переместил tmp \ Repeat обратно в текущую папку. Снова и снова!

 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);
 }

ChkSystem просто выполняет вызов system () и проверяет возвращаемое значение, останавливаясь, если оно не удалось.

Важно отметить, что это не удалось несколько раз. Я подумал, что, возможно, моя программа не работает или что она все равно бесконечно длинная. Однако, у меня было это раньше с системными вызовами, с вещами, которые не синхронизировались, поэтому я просто запустил программу снова, и она продолжилась с того места, где она остановилась, так что не думайте, что ваша программа не работает. В общей сложности, после запуска около 20 раз, он очистил их всех. В общей сложности изначально было около 1280 папок. Понятия не имею, что вызвало это. Сумасшедший.

DenM
источник
0

С 3-уровневыми циклами каталогов:

: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
источник
Объяснение, чтобы пойти вместе с кодом? <:: ;; :: ;; :: ;; :: ;;: :( | XXXX |) o ~
Сок Pimp IT
0

Я исправил это, запустив chkdsk / f через консоль администратора, перезагрузил и затем удалил проводник. Хотя Windows жаловалась на длинный файл / папку, она избавилась от проблемной рекурсивной папки, как только я подтвердил удаление.

Не уверен, что есть другие проблемы, которые я мог создать, используя старый параметр chkdsk в моей файловой системе Windows 7 Pro.

Лакс
источник
0

Для меня этот вариант метода Windows RoboCopy работал:

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

Да, это требует времени, но сделал свою работу.

Димитар II
источник
-1

Просто запустите MS ROBOCOPY следующим образом:

  1. Создайте «пустую папку» с тем же именем, что и папка, которая содержит «бесконечно повторяющееся дерево каталогов».
  2. Запустите ROBOCOPY из командной строки с параметром / MIR.
  3. После окончания ROBOCOPY (и это может занять несколько секунд),
  4. Удалите папку с «бесконечно повторяющимся деревом каталогов», которое теперь является «пустой папкой».
  5. Также продолжайте и удалите «пустую папку», которую вы создали в Шаге 1.

, , , , , , , , , , , , , , ,

РОБОКОПИЯ "C: \ anyplace \ BADFOLDER" "C: \wherever \ BADFOLDER" / MIR

Куда:

C: \ anyplace \ BADFOLDER .. "пустая папка", которую вы создали, и

C: \ wherever \ BADFOLDER .. - это папка, в которой находится «бесконечно повторяющееся дерево каталогов».

, , , , , , , , , , , , , , ,

После запуска ROBOCOPY .. Теперь у вас есть два "пустых" ПЛЕМЕНА.

Чтобы очистить, удалите оба

C: \ где угодно \ BADFOLDER и C: \ везде где \ BADFOLDER

Р. Серпкенчи
источник