如何删除嵌套很深的文件夹并避免“文件名过长”?


70

Eclipse在其中一个嵌套非常深的目录中创建了一个temp文件夹,例如

dir1\dir1\dir1\dir1\...

我无法通过资源管理器,delor rmdir命令或Cygwin'rm'命令在Windows中删除此文件夹。我应该如何删除这个很长的文件夹?

它只会说“文件名太长...”


Answers:


105

如果您像我一样,并且不想安装其他软件来解决此类问题,那么我会接受XQYZ的建议,并使用它robocopy来解决问题。(在我的情况下,问题是由robocopy首先创建的,它是通过复制其中具有递归结点的目录而不向robocopy提供/ XJ来创建的)。

要删除从c:\ subdir \ more \ offending_dir开始的目录树:

整个逐步过程非常简单:

  1. cd c:\subdir\more cd进入其父目录。
  2. mkdir empty 创建一个空目录。
  3. robocopy empty offending_dir /mir 将空目录镜像到有问题的目录中。
  4. 等待一会儿,您就完成了!完成它:
  5. rmdir offending_dir 摆脱现在空的令人讨厌的目录,并
  6. rmdir empty 摆脱中间的空目录。

2
很好的建议。我的问题也是由robocopy造成的,正如您所描述的,robocopy修复对我有用。
弥敦道(Nathan Garabedian)

3
我也弄乱了robocopy交汇点;感谢您向我展示如何使用它来清理混乱!
Wizard先生2012年

我的文件夹不是由robocopy创建的,但是它完美地删除了它们
Sasha 2014年

11
节点程序包管理器(NPM)对我造成了此问题。由于某种原因,嵌套包太多了。
David Sherret 2014年

这显然是最好,最合理的答案,比定制的递归批处理脚本好得多
monastic-panic

39

实际上,这很容易解决。说目录结构是这样的:

C:\Dir1\Dir1\Dir1\Dir1…

要解决此问题,只需将每个文件夹重命名为一个字符的文件夹名称,直到不再需要太长时间才能删除:

  1. 重命名C:\Dir1C:\D
  2. 导航 C:\D\
  3. 重命名C:\D\Dir1C:\D\D
  4. 导航 C:\D\D\
  5. 转到1,直到路径的总长度小于260

这是一个用于自动执行该过程的批处理文件(此简单版本最适合问题中所述的简单目录,尤其是一次性目录)。它传递文件夹最大可能的(例如C:\Dir1C:\Dir1\Dir1\Dir1…C:\Users\Bob\Desktop\New FolderC:\Users\Bob\Desktop\New Folder\abcdefghi…

@echo off
if not (%1)==() cd %1
for /D %%i in (*) do if not %%i==_ ren "%%i" _
pushd _ 
%0 
popd

技术说明

提出的其他解决方案是后退的;您无法通过从最内层目录向外进行修复,而需要朝另一个方向进行。

当您尝试访问目录时,可以使用其绝对路径(无论是否显式)来进行访问,其中包括该目录之前的所有内容。因此,对于像这样的目录结构C:\Dir1\Dir1\Dir1\Dir1,到最里面的路径的长度Dir1是22。但是,到最外面的路径的长度Dir1只有7,因此无论其内容如何(在给定目录路径的上下文中)仍然可以访问。 ,则文件系统不知道其包含的内容或对其子目录的总路径长度的影响;只有其祖先目录-如果总路径长度太长,则无法重命名目录)。

因此,当遇到一条太长的路径时,您需要做的是尽可能达到最高级别,并将其重命名为一个字符的名称,然后为其中的每个级别重复。每次这样做,路径的总长度都会因旧名称和新名称之间的差异而缩短。

反之亦然。您不能创建大于支持的最大长度的路径(在DOS和Windows上,MAX_PATH = 260)。但是,您可以重命名目录(从最内部向外)到更长的名称。结果是绝对路径> 260的更深的文件夹将无法访问。(由于它们足够简单,所以并不能“隐藏”或保护它们,因此请勿使用此方法隐藏文件。)


有趣的旁注

如果您在Windows 7资源管理器中创建文件夹,则似乎资源管理器允许您创建子目录,使总长度大于MAX_PATH,实际上是,但实际上,它是通过使用“ DOS 8.3文件名”作弊的。您可以通过创建如下树来查看此情况:

C:\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
   \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
    \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
     \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
      \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
       \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
        \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
         \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
          \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
           \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
            \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\

它的长度为696个字符,当然比260个字符长得多。此外,如果导航到资源管理器中最里面的子目录,则当它不在焦点上但单击地址时,它将按预期在地址栏中显示它条,它将路径更改为C:\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\,只有102个字符长。

在XP中,它不会执行此操作,而是坚决拒绝创建比所支持的路径更长的路径。

真正有趣的是找出NtfsDisable8dot3NameCreation设置该选项后Windows 7 Explorer如何处理“过长路径” 。


3
可以创建一个路径比MAX_PATH更长的时间,因为在这里解释。不幸的是,\\?` doesn't work with rmdir`。
grawity 2011年

@grawity,是的,但这是因为它在相同的原理下工作:短路径重命名为较长路径;通过扩展变量来动态地做到这一点,而不是手动将其重命名为更大的变量。当创建命令具有足够的信息来确定总长度时,不可能创建绝对路径太长的目录。
Synetech 2011年

3
@Synetech:不,它的工作方式不同。诸如此类的路径\\?\C:\dir\dir\dir\dir实际上绕过了 MAX_PATH; 没有涉及“变量”。(但是就像我说的,由于某种原因,它不能与rmdir其他cmd.exe内置命令一起使用。)
grawity 2011年

例如,尝试运行md C:\01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 它将无法工作,因为文件系统具有足够的信息来确定总路径长度为263个字符,因此它失败了。
Synetech 2011年

2
(此外,请勿将路径长度与组件长度混淆。您不能拥有名称超过255个字符的单个目录;但是,您可以拥有比该路径更长的路径。)
grawity 2011年

17

您可以通过使用subst创建虚拟驱动器来缩短路径:

C:\>subst Z: "C:\TEMP\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1"

更改为虚拟驱动器:

cd Z:

现在您可以删除文件:

del *.*

删除虚拟驱动器:

cd C:\TEMP
subst Z: /d

删除目录:

rd /s dir1

不; 如果目录太长,则第一个命令将不起作用;它将返回错误的Invalid参数
Synetech 2011年

2
@Synetech,当然,但是如果您只使用C:\TEMP\dir1\dir1\dir1,那么它将缩短其中的一部分,从而使您可以进入。就像您重命名的建议一样,但可以使用映射。;)
Bobson

@鲍伯森,好吧,你是对的。你们俩都+1。:-)
Synetech

10

我编写了一个小型C#应用程序,以帮助我删除由于粗心地使用Robocopy和从Homeserver备份而产生的非常深层的结构。默认情况下,Robocopy将关节点视为常规文件夹... :-(您可能会在不注意的情况下陷入混乱。

CodePlex附带源文件可使用该工具,任何人都可以使用。

http://deepremove.codeplex.com


作品!!!此答案必须标记为有效!该软件像黄油一样工作..在几秒钟内解决了我的问题!!谢谢!
拉菲克·穆罕默德

7

不久前,我创建了一个小型的,实用的实用程序可执行文件,称为DeleteFiles,您可以使用它轻松地执行此任务。

使用这个独立的实用程序,您可以轻松地执行以下操作:

deletefiles c:\yourfolder\subfolder\*.* -r -f

删除整个文件夹结构。-r从起始目录向下递归文件夹层次结构,-f删除所有空文件夹(如果将用作文件规范,则全部为空)。DeleteFiles支持的路径长度超过Windows MAX_PATH的限制,因此它在深度嵌套的文件夹上也可以正常工作。

DeleteFiles是免费的开放源代码,您可以从GitHub获取二进制或源代码,也可以直接使用Chocolatey安装


谢谢,真棒工具,++可以使它充满巧克力感;)使其易于集成到CI工具中!
Charles Ouellet 2015年

1
这成功了。如果您的路途很长,那么添加> NUL到末尾可以使过程更快。
ryscl

robocopy解决方案不适用于我,也不适用Synetech的解决方案。DeleteFiles对我有用,但是由于某种原因,我必须运行它三次,才能删除所有子文件夹。无论如何,这解决了我的问题。
弗兰克

回复:运行DeleteFiles 3次。我也看到了-我相信这是由于某些Windows怪癖,即使文件被删除,它们也会在很短的时间内锁定其中包含文件的文件夹。多次通过会在子文件夹中偶尔遇到此问题的故障-可能是多重嵌套。我发现资源管理器删除深树的行为相同。
里克·斯特拉

5

现在简单易用

自从使用非常嵌套文件夹的node_modules以来,我一直面临着同样的问题。因此,最终制作了一个脚本来修复该脚本,该脚本可以通过缩短路径来删除文件夹。

https://github.com/dev-mraj/fdel

npm install fdel -g

fdel ./node_modules

我不知道为什么设计师本可以使用平面结构将所有依赖项包含在结构中。所以这个脚本对我来说是最简单的方法,因为我已经在使用node.js
2016年

4

在使用Sikuli时,我在程序中遇到了Calculator.sikuli递归循环,使“ calculator.sikuli.calculator.sikuli”的数量成倍增加。我可以移动树,但是路径名太长而无法删除。

在尝试了几种使用popd循环的解决方案之后,Scandisk却无处可寻。

我编写了此脚本,以“深入”到递归的dirs(在称为“ a”的目录中),将其移动到(称为“ b”的目录中),然后删除被截断的树,将其移回(到“ a”中) ,然后重复:

1)cd D:\a\calculator.sikuli\calculator.sikuli\calculator.sikuli\calculator.sikuli
.............go deeeeeep in         dir *A*
2) move calculator.sikuli ---> D:\b    
.............move the crazy tree to dir *B*    
3) kill D:\a\calculator.sikuli <---KILL(rd)    
.............wipe dir *A*'s tree    
4) move D:\b\calculator.sikuli ---> D:\a\    
.............move the crazy tree back to dir *A*    
REPEAT
  • REM用于删除无限递归的子文件夹
  • REM建议先停止Windows搜索服务(services.msc)

Remdirs.bat

D:
cd D:\a\calculator.sikuli\calculator.sikuli\calculator.sikuli\calculator.sikuli
move /-Y calculator.sikuli D:\b
cd D:\b
rd /s/q D:\a\calculator.sikuli
move /-Y calculator.sikuli D:\a
call D:\remdirs2.bat

这只是再次运行批处理文件的调用。


我花了几个小时研究这个问题。该.bat文件就像来自天堂的礼物。筒仓,你是天使。xD
Squish

2

当eclipse决定在硬盘驱动器上创建垃圾时,我们遇到了这样的问题。我们通过使用robocopy的/ MIR函数将一个空目录镜像到嵌套目录中来修复它。


1

我会尝试打开命令提示符并运行:

rmdir /s <directory>

如果那行不通,我将进入目录树的cd中,尝试删除目录的一个子集(例如20个最里面的目录),然后从那里找出解决方法。


1
我在上面尝试了您的建议,并且在多个级别上运行上述命令时,它仍然显示“目录不为空”
user39186 2011

1
这是因为此方法是向后的。;-)
Synetech 2011年

1

如果是网络文件夹,则只需共享该目录的父目录并将其映射到本地计算机上的驱动器,然后删除您的文件夹。


21966 [main] mv 1288 D:\ work \ software \ cygwin \ bin \ mv.exe:***严重错误-读取Windows环境时发生内部错误-环境变量过多?
user39186 2011年

我尝试将一个子文件夹移动到嵌套20层的深度,并遇到了上述错误
2011年

1

打开命令提示符。

导航到包含最高“ dir1”的文件夹/目录(我们假设为C:\)

c:\> RD /s dir1

编辑 (添加注释后)

其他想法:

MS在此处提供有关如何处理问题的信息(可以尝试的许多想法)。

还有一个工具(从未亲自使用过)-TooLongPath

也许写一些东西(因为有了Eclipse)可以一直导航到整个文件夹,然后一次退出一个文件夹级别,并随即删除?


1
使用上述命令时收到以下3个错误。目录不为空系统找不到指定的路径文件名太长
user39186 2011年

我尝试遍历说'n'的水平并尝试使用相同的命令,但这似乎无济于事
user39186 2011年

这在win7上对我有用!谢谢
leoh

1

另一个解决方案:下载Total Commander。这是一个非常有用的程序,不仅因为它知道长文件名。

未注册的版本是nagware,但功能齐全,它将完成工作。


1

可以直接从命令行或在批处理文件中完成此操作,方法是构建要删除的目录的UNC路径

所以代替

rmdir /s/q c:\mydirectory

采用

rmdir /s/q \\?\c:\myDirectory

这样的UNC样式路径可能更长,并绕过了260个字符的限制。


不起作用 The path \\?\C:\temp\wqiyretiuqyertiuyqwteiyrutqwuiyertiqrqweirqyert\wqteriuwqyetriuqwteiryutwiuertiuyqerieerrt\IOQWUE~1\QIWUYE~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\ OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1 is too long.Windows 7 64位。
维克多

对于Windows 10不起作用。仍然太长。
BananaAcid

\\?`版本在Windows 10上对我有效!
彼得

0

当我遇到这个问题时,我只是简单地重命名了一些短得多的文件夹名称,然后,如果总路径足够短,它将被删除。无需额外的工具。


是的,但是就像我说的那样,您必须从外部开始工作,否则将无法工作。
Synetech 2011年

当然。我通常发现最长的文件夹名称通常是第一个(在修补程序文件夹中)或最后一个。大多数时候,您只需要更改一个或两个文件夹名称即可将其设置为正确的长度。
音乐

是的,但是如果您从最里面的一个开始,它将无法正常工作,因为该ren命令将以失败path too long
Synetech 2011年

1
是的,上面提供的脚本是自动解决此问题的聪明有效的方法。这只发生在我身上几次,所以我只使用了手动重命名过程。为此,我只是开始重命名问题树中的文件夹结构,而我的经验是,最长的文件夹名称经常出现在树结构的开头或结尾。因此,我的答案是有效的,尽管这里可能不是最强或最聪明的答案。不值得一票。
音乐

>我只要在碰巧的树中碰巧遇到的地方就开始重命名文件夹结构,是的,如果您已经在树中,那么您至少可以重命名该文件夹(您需要转到其父目录) ; 您也可以重命名子文件夹,但是可能太长了。
Synetech 2011年

0

我有相同的问题,除了它是由递归Cobian Backup任务创建的。我发现免费的Cobian软件包括一个Deleter应用程序,可以轻松快速地删除这些令人讨厌的嵌套文件夹。

它位于工具菜单下。



-3

您的文件系统可能已损坏。运行chkdsk以查看它是否可以修复任何东西,然后尝试删除该文件夹。


不,那不是问题。问题是总路径长度比支持的长度(MAX_PATH=255)长。即使文件系统没有损坏,也可能发生这种情况。
Synetech

在文件夹上运行chkdsk给我以下错误。驱动器,路径或文件名无效
user39186 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.