我们在这里有一个小问题。
我们与所有服务器办公室的备份有一个共享,它是一个非常大的份额,超过8.000.000个文件。
我们的用户通常给他们创build的文件夹长名称,然后使子文件夹(太长)和更多的子文件夹…以及更多的subfolders …
我们有更多的容量新的份额,并与一个simpe robocopy蝙蝠我们复制所有的文件和文件夹(一些给出问题,但我们手动复制它们)
但问题是删除它们。 德尔命令没有很好的工作,当这么长的path,neirder rmdir …我试过一些指挥官,但没有运气。
你可以推荐我的任何工具,可以删除recursion或能够删除255 +path?
编辑:在共享的背景下,它是NetApp操作系统。 但是我可以从Windows服务器访问它。 2000年和2003年
谢谢。
不完美的解决scheme,但工程
这是Windows脚本我脚本解决问题的脚本。 这不是完美的,但如果任何人有同样的问题可以使用它。
Option Explicit DIM strFolder DIM objFSO ' ************************************************************ ' Setup ' ************************************************************ ' Folder to delete files from (files will also be deleted from subfolders) strFolder = "Z:\del" ' ************************************************************ set objFSO = createobject("Scripting.FileSystemObject") Wscript.echo "Processing " & strFolder RecursiveDeleteByExtension strFolder wscript.echo "Finished" sub RecursiveDeleteByExtension(byval strDirectory) DIM objFolder, objSubFolder, objFile, Tmp, Indice set objFolder = objFSO.GetFolder(strDirectory) Wscript.echo "Processing " & strDirectory for each objFile in objFolder.Files WScript.echo "Deleting:" & objFile.Path objFile.Delete next Indice = 0 For each objSubFolder in objFolder.SubFolders If Len (objSubFolder.Name) > 5 Then Indice = Indice + 1 objSubFolder.Move(objFolder.Path & "\" & Indice & ".t") End if Next for each objSubFolder in objFolder.SubFolders RecursiveDeleteByExtension objSubFolder.Path Next objFSO.DeleteFolder(strDirectory) end sub
这个脚本recursion地做了一个很长的path,比如\ bla … \ bla … \ bla … \ bla …到更短的\ 1 \ 2 \ 1 \ 2 \在每次recursion结束时重命名,它删除对象文件夹(谁是空的,顺便说一句)。
它对我来说工作得非常好,即便如此,我们find了200个字符左右的完整path(想像在脚本之前)。
这是C#中的一个程序dot_deltree.cs ,它可以删除任何深度的目录树。 它通过首先将太深的目录移动到最浅的目录中的随机名称来工作。
using System; using System.IO; public class dot_deltree { public static void Main(string[] args) { if ( ! (args.Length == 1) ) { Console.Error.WriteLine("Usage: dot_deltree [path]"); Environment.Exit(1); } string dirname = args[0]; if ( ! Directory.Exists(dirname) ) { Console.Error.WriteLine("{0} does not exist or is not a directory!", dirname); Environment.Exit(1); } confirm_deleting(dirname); while ( true ) { string too_deep_dir = deltree( dirname ); if ( too_deep_dir.Equals("") ) { break; } string randomname = Path.GetRandomFileName(); Console.Error.WriteLine( "Moving too deep directory {0}:{2} to random name {1}", too_deep_dir, randomname, too_deep_dir.Length ); Directory.Move( too_deep_dir, Path.Combine(dirname,randomname) ); } } public static void confirm_deleting(string path) { Console.Write("Do you really want do delete directory {0} recursively (type YES)? ", path); string result = Console.ReadLine(); if ( ! result.Equals("YES") ) { Environment.Exit(1); } } public static string deltree(string uncpath) { if ( uncpath.Length > 200 ) { return uncpath; } string[] subdirectories = Directory.GetDirectories(uncpath); foreach (string subdirectory in subdirectories) { string result = deltree(subdirectory); if ( ! result.Equals("") ) { // Return up too deep directory return result; } } // Console.Error.WriteLine("Deleting {0}", uncpath); Directory.Delete(uncpath,true); return ""; } }
编译使用Mono C#编译器使用gmcs dot_deltree.cs为.NET 2.0在这里 (4kb)。
('dir / ad / b')do rm / s / q“%a”中的/ f“delims =”%a – 它将recursion地且不要求删除dir / ad中列出的当前目录的所有子目录/ b输出
如果这个共享是一个分区上的唯一的东西,那么只需要重新格式化它是最容易的。
如果在分区上有值得保存的东西,那就把它复制到某个地方,重新格式化并复制回来。
尝试使用“deltree”。 我现在只在linux上,但我build议做一个“deltree /?” 第一!
你有没有尝试过WinDirStat我不知道有关255的限制,因为它发出Windows命令做删除,但它可能会帮助你解决混乱更容易。
否则非常有用的工具
如果使用robocopy / move选项,会发生什么情况? 这将复制后从源删除文件。
如果使用ROBOCOPY和/MIR标志来镜像不需要的文件之上的空文件夹? 如果它足够聪明,可以复制名称较长的文件,那么删除它们应该足够聪明。
MKDIR empty ROBOCOPY empty <dest> /MIR
Althoguh有可能不会比Chris的build议做得更远。