Як видалити нескінченно повторюване дерево каталогів?


9

На одному з наших файлових серверів Windows 2003 якимось чином чи комусь вдалося створити нескінченно повторювані дерева директорій у домашніх папках користувачів, і їх неможливо видалити.

Ви закінчуєте щось подібне:

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

І це триває нескінченно, наскільки я зміг сказати.

Спроба видалити дерево каталогів із системи, на якій він знаходиться, приводить до результатів у "Помилка видалення файлу чи папки: Неможливо видалити файл:". Спроба видалити його із системи Windows 7, підключеної до мережевої спільної доступу, призводить до помилки "папка у використанні".

Якщо ви переходите по дереву каталогів до кінця, ви в кінцевому підсумку дістаєтеся до каталогу, який неможливо відкрити чи видалити (якщо натиснути правою кнопкою, не з’являється жодна зі стандартних опцій), однак якщо ви спробуєте відкрити той самий каталог із спільного доступу до іншої системи його можна відкрити, проте Windows Explorer стає надзвичайно повільним.

Я пробував пропозиції в цій публікації, а також завантажував сервер з диском Linux і намагався rm -rf каталог, не працював.

Це таємниця.

Редагувати: Можу також додати, що можна перейменовувати каталоги, а не видаляти їх.


1
Аналогічна проблема була вирішена в серверній помилці .
Ліліенталь

Відповіді:


14

У мене також була нескінченна рекурсивна папка, створена Java IDE, і я не зміг її видалити ні в Провіднику Windows, ні в записі cmd.

Однак, коли я встановив git, я також встановив git-bash. У git-bash ви можете задати команду:

rm -rfd recursive_folder_name

і вона подбає про це.


Важлива примітка: це може зайняти величезну кількість часу ...
Перервіться

також працює, якщо використовувати Linux на базі vmware та монтувати диск (якщо він зовнішній ...)
Wolfgang Fahl

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

У мене була подібна проблема, коли затемнення створило глибоко глибоке дерево папок, яке я не міг видалити. Однак, оскільки можна було переміщувати та перейменовувати папки, я написав пакетний файл для роботи, це вниз по дереву, видаляючи папки одна за одною, і це спрацювало! Для очевидно нескінченно глибокого дерева папок 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 є щонайменше одна папка щоразу, коли цикл запускається, зрештою досягаючи нижньої частини, видаляючи папку вгорі.


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

0

У мене була така ж проблема. Папка, яку я хотів видалити, містила нескінченне дерево посилань на те саме ім'я, і ​​кожна спроба її видалити викликала помилку "Файл задовго ...". Не вдалося незалежно від команди, яку я спробував, включаючи всі перераховані вище методи, тому я спробував команду Cygwin "rm" у вікні cmd безпосередньо над папкою, про яку йдеться. Я ввів "rm -r -f [папка]" і папку було видалено без скарги.

Ви можете завантажити Cygwin безкоштовно з https://cygwin.com/install.html . Це, в основному, оболонка UNIX для Windows, яка містить усі загальні команди (наприклад, ls, rm, du та cat), але також має багато пакетів, які, якби всі були завантажені, займали б близько 1 Гб місця. Я вважаю, що пакет завантаження за замовчуванням включає команди UNIX. Якщо ні, вони знаходяться в пакеті "утиліти", якщо пам'ять служить.

ПРИМІТКА: Вам не потрібно запускати команди Cygwin у рідному вікні оболонки bash. Їх можна запустити у вікні cmd, додавши шлях до каталогу "bin" cygwin до змінної середовища PATH вашої системи. У своєму випадку я додав "C: \ cygwin64 \ bin".

Я сподіваюся, що це допомагає.


0

У мене така сама проблема.

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

У цей потрібний момент я запускаю це з "> нулем" для прискорення роботи (це, справді):

"C: \ TEMP" - це порожня папка, а "W: \ TMP" - папка, на яку впливає :

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


1
Ласкаво просимо до Супер Користувача. Якщо ви посилаєтесь на рішення з іншого місця, будь ласка, додайте атрибуцію та посилання для подальшого читання. Відповіді призначені для остаточного рішення. Якщо ви все ще намагаєтеся це зробити, це може бути передчасно.
fixer1234

0

У мене теж це було в автономній системі Windows 10. C: \ Користувач \ Ім'я \ Повторити \ Повторити \ Повторити \ Повторити \ Повторити \ Повторити \ Повторити, здавалося б, до нескінченності.

Згідно з ОП, я міг перейти за допомогою Windows або командного рядка приблизно до 50-го, і далі. Я не зміг її видалити або натиснути на неї тощо, як описано раніше.

C - це моя мова, тому врешті-решт я написав програму з циклом системних викликів, які повторюються, поки вони не завершаться. Відповідно до коду DOS від JohnO, я створив каталог під назвою tmp і перемістив Повторити \ Повторити в цьому, видалив тепер порожню папку Повторити і перемістив tmp \ Повторити назад у поточну папку. Знову і знову!

 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 просто запускає системний () виклик і перевіряє повернене значення, зупиняючись, якщо воно не вдалося.

Що важливо, це було кілька разів. Я подумав, що, можливо, моя програма не працює або ж вона була нескінченно довгою. Однак у мене це було раніше із системними дзвінками, коли речі не синхронізувалися, тому я просто запустив програму ще раз, і вона продовжувалася з того місця, де вона припинилася, тому не думайте, що ваша програма не працює. Загалом, після запуску його близько 20 разів, він очистив їх усіх. Загалом спочатку це було близько 1280 папок. Поняття не маю, що це спричинило. Божевільний.


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

Пояснення йти разом з кодом? <:: ;; :: ;; :: ;; :: ;;: :( | XXXX |) про ~
Pimp Juice IT

0

Я вирішив це за допомогою запуску chkdsk / f через консоль адміністратора, перезавантажив, а потім використовував видалення файлів Explorer. Хоча Windows скаржився на довгий файл / папку щось, він позбувся проблемної рекурсивної папки, як тільки я підтвердив видалення.

Не впевнений, чи є інші проблеми, які я міг би створити за допомогою старої опції chkdsk у моїй файловій системі Windows 7 Pro ..


0

Для мене цей варіант методу Windows RoboCopy працював:

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

Так, це потребує часу, але зробив роботу.


-1

Просто запустіть MS ROBOCOPY наступним чином:

  1. Створіть "порожню папку" з тим самим іменем, що і папку, яка містить "нескінченне дерево каталогів".
  2. Запустіть ROBOCOPY з командного рядка за допомогою параметра / MIR.
  3. Після закінчення ROBOCOPY (і це може зайняти кілька секунд),
  4. Видаліть папку з "нескінченно повторюваним деревом каталогів", яке тепер є "порожньою папкою".
  5. Також продовжуйте і видаляйте "порожню папку", яку ви створили на кроці 1.

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

РОБОКОПІЯ "C: \ anyplace \ BADFOLDER" "C: \ де б \ BADFOLDER" / MIR

Де:

C: \ anyplace \ BADFOLDER .. - "порожня папка", яку ви створили, і

C: \ wherever \ BADFOLDER .. - папка, де знаходиться "нескінченно повторюване дерево каталогів".

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

Після запуску РОБОКОПІЇ. Тепер у вас є два "порожніх" БАДА.

Щоб очистити, видаліть обидва

C: \ anyplace \ BADFOLDER та C: \ wherever \ BADFOLDER

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.