子文件夹数量巨大,且很长。如何才能全部删除?

子文件夹数量巨大,且很长。如何才能全部删除?

我们这里有一个小问题。

我们共享所有服务器办公室的备份,这个共享非常大,有超过 8,000,000 个文件。

我们的用户通常会给他们创建的文件夹起一个长名字,然后创建子文件夹(也很长)以及更多的子文件夹...以及更多的子文件夹...

我们有一个具有更多容量的新共享,并且使用一个简单的 robocopy bat 我们复制了所有文件和文件夹(有些出现问题,但我们手动复制了它们)

但问题是删除它们。当路径太长时,del 命令不能很好地工作,neirder rmdir...我尝试了一些命令,但没有运气。

您能推荐我任何可以递归删除或删除 255+ 条路径的工具吗?

已编辑:共享后台的 SO 是 NetApp OS。但我可以从 Windows 服务器访问它。2000 和 2003

谢谢。

虽然不是完美的解决方案,但有效

这是我在 Windows Scripting 上编写的解决该问题的脚本。它并不完美,但如果有人遇到同样的问题,可以使用它。

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

该脚本以递归方式执行的操作是将非常长的路径(如 \bla...\bla...\bla...\bla...)更改为更短的 \1\2\1\2\,并且在每次递归结束时重命名后,它会删除对象文件夹(顺便说一下,该文件夹是空的)。

对于我来说,它工作得非常好,即使如此,我们也发现完整路径接近 200 个字符(想象一下脚本之前)。

答案1

这是一个dot_deltree.cs用 C# 编写的程序,用于删除任意深度的目录树。它的工作原理是先将太深的目录移动到最浅的目录中的随机名称。

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)。

答案2

尝试对于/f“delims =”%a在('dir / ad / b')中执行rm / s / q“%a”- 它将以递归方式删除当前目录中列出的所有子目录,而无需询问目录/广告/b输出

答案3

如果此共享是分区上的唯一内容,那么最简单的方法是重新格式化它。

如果分区上有值得保存的内容,则只需将其复制到某处,重新格式化并复制回来。

答案4

你有没有尝试过目录统计我不确定 255 的限制,因为它会发出 Windows 命令来执行删除操作,但它可能会帮助您更轻松地理清混乱。

非常有用的工具

相关内容