我今天正在测试一个文件管理程序,在寻找解决其他问题时,我的程序最终没有检查是否将目录移动到同一目录。
结果是dir1s可能无限递归。我需要提交更改,所以我迫切希望将这些更改出我的存储库。
有任何想法吗?
基本上......我得到的是:
dir / dir / dir / dir ......... / dir / dir / dir这可能是成千上万的。
您是否只是想删除目录和所有子目录?来自命令提示符的RMDIR /S /Q [dirname]
应该可以解决问题。
更新尝试此解决方法:
robocopy dummy_dir problem_dir /purge
安装Git Bash或其他形式的linux shell模拟器。工作完美,没有任何麻烦。
rm -rf / c / offending / dir
感谢Meghraj Choudhary为脚本删除了Windows上的文件。 https://github.com/dev-mraj/fdel
他声称它缩短了路径,从而有助于删除它们对节点开发人员有帮助
npm install fdel -g
fdel ./node_modules
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>
我必须构建一个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()));
}
}
}
}
更新: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位上运行。
我失去了一天。希望这有助于其他人不这样做。
上述解决方案均不适合我。我的嵌套文件夹至少在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
在Daniel Santos的帖子中,只需用false初始化var del,然后在下一个循环中添加| !del条件:
例如:
boolean del = false;
while (... | !del) {
...
..
.
工作良好!