在Windows上删除一个非常非常深的子目录树?

问题描述 投票:7回答:8

我今天正在测试一个文件管理程序,在寻找解决其他问题时,我的程序最终没有检查是否将目录移动到同一目录。

结果是dir1s可能无限递归。我需要提交更改,所以我迫切希望将这些更改出我的存储库。

有任何想法吗?

基本上......我得到的是:

dir / dir / dir / dir ......... / dir / dir / dir这可能是成千上万的。

windows directory filesystems
8个回答
20
投票

您是否只是想删除目录和所有子目录?来自命令提示符的RMDIR /S /Q [dirname]应该可以解决问题。

更新尝试此解决方法:

  1. 在问题目录的顶层,创建另一个名为'dummy_dir'的目录
  2. 运行robocopy dummy_dir problem_dir /purge

5
投票

安装Git Bash或其他形式的linux shell模拟器。工作完美,没有任何麻烦。

rm -rf / c / offending / dir


1
投票

感谢Meghraj Choudhary为脚本删除了Windows上的文件。 https://github.com/dev-mraj/fdel

他声称它缩短了路径,从而有助于删除它们对节点开发人员有帮助

npm install fdel -g
fdel ./node_modules

0
投票

robocopy解决方案非常有效。确保命令行提示符具有管理员权限(如果没有,您将看到“拒绝访问”消息)。

BTW:当我们遇到类似的问题时,我正在使用已安装的Webserver(Coldfusion)以递归方式删除由另一个cfm脚本意外创建的文件夹结构。以下代码可以ev。用Java或其他语言重写。 - 因为安装Web服务器可能有点矫枉过正以克服你的问题;-)

<!--- 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>

0
投票

我必须构建一个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
投票

更新:2015年1月9日12:49

因此,在意识到我的递归错误仍然存​​在的困难之后(见下面的原始帖子)我偶然发现了这篇文章:https://superuser.com/a/425666。它涉及编写批处理文件以在问题目录上执行rename move delete repeat循环。这实际上相当优雅地解决了问题,因为它是自上而下的删除而不是自下而上。

我想请注意,我尝试了这个线程中提供的所有解决方案都无济于事。我想我只是有一个非常极端的情况(与OP不同)。来自superuser.com(上面)的链接表现得很漂亮。


原始回应

今天我遇到了一个类似的问题,一个递归错误在我的项目结构中创建了一个荒谬的巨大文件树。它被官方视为Microsoft知识库中的“不可删除”目录结构。 (我已经失去了我在那里引用的链接。如果我找到它,我会更新这篇文章以包含它。)

现在,我没有将这个结构提交给任何回购,但它正在研究我的SVN实用程序和IntelliJ的索引程序来完成静止。当我等待的时间足够长时,两个应用程序最终都在试图遍历这个可怕的目录结构。

但是,我只需移动违规目录树的最上面的目录就能解决问题。例如,给定此路径:

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

我刚刚在我的项目结构之外创建了一个_undeletable目录,并执行了一个简单的基于GUI的剪切和粘贴topOfBadTree文件夹 - 这意味着我从我的项目中删除它并将其粘贴到_undeletable目录中。

突然,IntelliJ和Tortoise SVN都恢复正常,我又回到了调试阶段。当然,这并不一定能解决问题,它会回避它,但如果目标是让项目结构恢复正常并再次工作,那么这应该可以解决问题。

此项目和所有讨论的应用程序都在Windows 7 Enterprise 64位上运行。

我失去了一天。希望这有助于其他人不这样做。


0
投票

上述解决方案均不适合我。我的嵌套文件夹至少在8000以上之前,至少在任何计算它的应用程序崩溃之前。 30分钟左右,robocopy在我身上坠毁。对我有用的是创建一个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,因此请确保您正确定义了您的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
投票

在Daniel Santos的帖子中,只需用false初始化var del,然后在下一个循环中添加| !del条件:

例如:

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

工作良好!

© www.soinside.com 2019 - 2024. All rights reserved.