如果你进入目录并且只使用相对路径来删除目录,就不需要长路径名。
或者,如果你安装了POSIX shell,或将其移植到DOS等效版本:
# untested code, didn't bother actually testing since the OP already solved the problem.
while [ -d Folder1 ]; do
mv Folder1/Folder1/Folder1/Folder1 tmp # repeat more times to work in larger batches
rm -r Folder1 # remove the first several levels remaining after moving the main tree out
# then repeat to end up with the remaining big tree under the original name
mv tmp/Folder1/Folder1/.../Folder1 Folder1
rm -r tmp
done
(使用一个shell变量来跟踪你在循环条件中重命名的位置是另一种不展开循环的选择,就像我在那里做的那样。)
这样可以避免KenD解决方案的CPU开销,该解决方案强制操作系统每次添加新级别时都从顶部遍历树到第n个级别,检查权限等。因此,它的时间复杂度为sum(1, n) = n * (n-1) / 2 = O(n^2)。从链的开头削减一块的解决方案应该是O(n),除非Windows需要在重命名其父目录时遍历树。(Linux/Unix不需要)从树的底部一直chdir到底,并从那里使用相对路径,随着chdir返回,删除目录的解决方案也应该是O(n),假设操作系统在您执行CDed某处的操作时不需要检查所有父目录的每个系统调用。
find Folder1 -depth -execdir rmdir {} +
在最深的目录中运行rmdir命令。或者实际上,find的-delete
选项也可以用于目录,并且隐含了-depth
。所以find Folder1 -delete
应该做相同的事情,但速度更快。是的,在Linux上的GNU find通过扫描目录、使用相对路径CD到子目录,然后使用相对路径rmdir
,最后chdir("..")
。它在向上遍历时不会重新扫描目录,因此会消耗O(n)
的内存。
这只是一个近似值:strace
显示它实际上使用unlinkat(AT_FDCWD, "tmp", AT_REMOVEDIR)
,open("..", O_DIRECTORY|...)
,和fchdir(打开目录的文件描述符)
,还有一些fstat
调用混合在其中。但如果在find运行时目录树没有被修改,效果是相同的。
编辑:只是为了好玩,我在GNU/Linux(Ubuntu 14.10)上尝试了这个(在一台2.4GHz的第一代Core2Duo CPU上,在一个XFS文件系统上,使用一块WD 2.5TB Green Power硬盘(WD25EZRS))。
time mkdir -p $(perl -e 'print "annoyingfoldername/" x 2000, "\n"')
real 0m1.141s
user 0m0.005s
sys 0m0.052s
find annoyingfoldername/ | wc
2000 2000 38019001 # 2k lines / 2k words / 38M characters of text
ll -R annoyingfoldername
... eventually
ls: cannot access ./annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername: File name too long
total 0
?????????? ? ? ? ? ? annoyingfoldername
time find annoyingfoldername -delete
real 0m0.054s
user 0m0.004s
sys 0m0.049s
# about the same for normal rm -r,
# which also didn't fail due to long path names
(mkdir -p 创建一个目录和任何缺失的路径组件)。
是的,真的只需要0.05秒来执行2k个rmdir操作。xfs在日志中很擅长将元数据操作批量处理在一起,因为他们在10年前就解决了元数据操作速度慢的问题。
在ext4上,创建操作花费了0m0.279秒,使用find删除操作仍然需要0m0.074秒。
rmdir
命令吗?尝试使用rmdir C:\storage\folder1 /s
。 - Mathias R. Jessen/MIR
参数,命令如下:ROBOCOPY /MIR C:\temp\EmptyDirectory C:\Storage\Folder1
另外也可以运行一次chkdsk
来检查一下。 - jscott/MIR
似乎持续时间更长,但最终也失败了("robocopy 已停止工作")。我有点害怕运行chkdsk
;这是一台相当老的服务器,我担心这个问题可能预示着更大的文件系统问题... - KenDfind
命令进行深度优先的目录删除:find Storage/Folder1 -depth -exec rmdir {} \;
。 - Johnnydel /s /q C:\Storage\Folder1
命令了吗? - alexiafind -exec
并不能解决。而是应该使用-execdir
在切换到正确位置后使用相对路径。 - Peter Cordes