Удалить очень, очень глубокое дерево подкаталогов на окнах? - PullRequest
8 голосов
/ 11 декабря 2011

Сегодня я тестировал программу управления файлами и, пытаясь решить что-то другое, моя программа не проверяла перемещение каталога в тот же каталог.

Результатом может быть бесконечная рекурсия dir1s. Мне нужно зафиксировать изменения, поэтому я отчаянно пытаюсь извлечь их из своего хранилища.

Есть идеи?

В основном .. что я получил:

dir / dir / dir / dir ......... / dir / dir / dir Это, вероятно, тысячи.

Ответы [ 8 ]

20 голосов
/ 11 декабря 2011

Вы просто пытаетесь удалить каталог и все подкаталоги?RMDIR /S /Q [dirname] из командной строки должно помочь.

Обновление Попробуйте это в качестве обходного пути:

  1. На верхнем уровне проблемыкаталог, создайте другой каталог с именем 'dummy_dir'

  2. Выполнить robocopy dummy_dir problem_dir /purge

5 голосов
/ 23 августа 2016

Установите Git Bash или другой эмулятор оболочки Linux.Работает отлично без каких-либо хлопот.

rm -rf / c / оскорбления / dir

1 голос
/ 21 февраля 2017

Спасибо Meghraj Choudhary за скрипт для удаления файлов на windows. https://github.com/dev-mraj/fdel

Он утверждает, что это сокращает путь и, таким образом, помогает удалить их Полезно для разработчиков узлов

npm install fdel -g
fdel ./node_modules
0 голосов
/ 29 июня 2017

В посте Даниэля Сантоса просто инициализируйте var del с помощью false и в следующем цикле добавьте | ! del условие:

Например:

boolean del = false;
 while (... | !del) {
...
..
.

Работает FINE!

0 голосов
/ 07 ноября 2015

Ни одно из приведенных выше решений не работает для меня.Мои вложенные папки находятся на глубине более 8000 глубин, по крайней мере, до того, как любое приложение, которое считает это, также упало.Робокопия обрушилась на меня через 30 минут или около того.Что мне подходит, так это создание bat-файла, который удаляет эти глубоко вложенные папки по частям.Хитрость заключается в том, чтобы выяснить шаблон повторения в вашей глубокой вложенности.

IE: если ваша структура каталогов \dirA\dirB\dirC\dirD\dirE\dirF\dirA\dirB\dirC\..., то ваш шаблон повторений \dirA\dirB\dirC\dirD\dirE\dirF\.Вставьте это в фрагмент кода ниже.Для моей проблемы мой шаблон повторения \demo\demoApp\app\src\main\java\com\utilities\.Там всегда будет шаблон, так что вы должны выяснить это, именно так эти вещи были созданы в первую очередь.

После этого убедитесь, что вы снова вызываете свой сценарий, чтобы рекурсивно разделить и уничтожить их раз и навсегда.Шахта находится на C:\Users\<your user name>\Desktop\deleteRecursive.bat, поэтому убедитесь, что вы правильно определили свой файл летучей мыши.

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

C:

REM  CD define the repetition pattern here!
cd C:\demo\demoApp\app\src\main\java\com\utilities\

REM Move the rest of the problem dir to a temporary parent folder
move /-Y demo C:\b

REM CD to the temp folder
cd C:\b

REM delete the section of problem-dir above
rd /s/q C:\demo

REM Move the rest of problem-dir back to origin
move /-Y C:\b\demo C:\

REM Call the script again until problem directory is gone!
call C:\Users\<your user name>\Desktop\delete.bat
0 голосов
/ 09 января 2015

Обновление: 09 января 2015 г. 12: 49

Итак, после того, как я понял, что мой рекурсивный баг все еще существует (см. Оригинальный пост ниже), я наткнулся на этот пост: https://superuser.com/a/425666. Это включает в себя запись командного файла для выполнения цикла rename move delete repeat над каталогом проблемы.Это на самом деле решает проблему довольно элегантно, поскольку это удаление сверху вниз, а не снизу вверх.

Хочу отметить, что я попробовал все решения, предложенные в этой теме, но безрезультатно.Я думаю, что у меня был очень экстремальный случай (мало чем отличающийся от ОП).Ссылка с superuser.com (выше), однако, выполнена прекрасно.


Исходный ответ

У меня была похожая проблема сегодня с ошибкой рекурсии, создававшей нелепо огромное дерево файлов в структуре моего проекта.Официально это считалось «неустранимой» структурой каталогов в Базе знаний Microsoft.(С тех пор я потерял ссылку, которую цитирую там. Если я найду ее, я обновлю этот пост, чтобы включить ее.)

Теперь у меня не было этой структуры, привязанной к репо,но это заточало мою утилиту SVN и процедуру индексации IntelliJ до полной остановки.Когда я подождал достаточно долго, оба приложения, в конце концов, разбомбили, пытаясь обойти эту ужасную структуру каталогов.

Однако мне удалось решить эту проблему, просто переместив самый верхний каталог дерева каталогов, нарушивший работу.Например, учитывая этот путь:

.../SomeProject/src/test/resources/com/myCompany/myApp/topOfBadTree/bad/bad/.../bad/...

Я только что создал каталог _undeletable полностью вне структуры моего проекта и выполнил простое вырезание и вставку на основе графического интерфейса папки topOfBadTree - то есть я обрезал ееиз моего проекта и вставил его в каталог _undeletable.

Внезапно IntelliJ и Tortoise SVN вернулись в нормальное состояние, и я вернулся к отладке.Конечно, это не обязательно решает проблему, она обходит ее, но если цель состоит в том, чтобы вернуть структуру проекта в порядок и снова работать, это должно сработать.

Этот проект и все обсуждаемые приложения былиработает на Windows 7 Enterprise 64-bit.

Я потерял один день на это.Надеюсь, это поможет кому-то другому НЕ делать то же самое.

0 голосов
/ 12 декабря 2014

Мне нужно было создать Java-программу для выполнения этой работы.Важно Threa.sleep (100), который вы увидите в следующих строках, поскольку это позволяет ОС Windows иметь время для удаления самого каталога deeeeeeep.Это сработало для меня.У меня было более 700 дочерних папок с тем же именем и в некоторых случаях с файлами внутри.

Проверьте это:

import java.util.Stack;

public class DelDir {

    /**
     * @param args
     * @throws InterruptedException 
     */
    public static void main(String[] args) throws InterruptedException {
        String path = "C:/your_path/problematic_dir";

        File file = new File(path);
        File[] files = null;
        Stack<File> stack = new Stack<File>();
        do {
            files = file.listFiles();
            if (files != null && files.length > 0){
                if (files.length == 1){
                    stack.push(files[0]);
                    file = files[0];
                    System.out.println(file.getPath());
                } else {
                    for (File afile : files){
                        if (afile.isDirectory()){
                            stack.push(afile);
                            file = afile;
                            System.out.println(file.getPath());
                            break;
                        }
                    }
                }
            }
        }while(files != null && files.length > 0);
        File toDel;
        boolean del;
        System.out.println(String.format("Files to delete: %1$d", stack.size()));
        while (stack.size() > 0){
            toDel = stack.pop();
            del = toDel.delete();
            Thread.sleep(100);
            if (del){
                System.out.println(String.format("[DELETED:OK] %1$s", toDel.getPath()));
            }else{
                System.out.println(String.format("[DELETED:ERR] %1$s", toDel.getPath()));
            }
        }


    }

}
0 голосов
/ 25 июня 2014

Решение Robocopy прекрасно работает.Убедитесь, что в командной строке есть права администратора (вы увидите сообщения «Доступ запрещен», если нет).

Кстати: когда у нас была похожая проблема, я использовал рекурсивно уже установленный веб-сервер (Coldfusion) для рекурсивногоудалить структуру папок, случайно созданную другим скриптом cfm.Следующий код может ev.переписать на Java или другом языке.- поскольку установка веб-сервера может быть немного излишней, чтобы решить вашу проблему; -)

<!--- Tag to delete all the wrongly created subdirectories by the buggy search index script version
--->

<cfdirectory directory="webroot" name="dirQuery" type="dir" action="LIST" filter="somefilter" recurse="yes">

<cfloop query="dirQuery">
<cfoutput>#directory#\#name#</cfoutput><br/>
<cftry>
    <cfdirectory action = "delete" directory = "#directory#\#name#" recurse="yes">
<cfcatch>
    <cfoutput>could not delete.</cfoutput><br/>
</cfcatch>
</cftry>
</cfloop>
...