Огромное количество подпапок и длинных подпапок. Как я могу удалить их все?

У нас есть небольшая проблема здесь.

У нас есть общий ресурс с резервной копией всех офисов сервера. Это действительно большой ресурс, содержащий более 8.000.000 файлов.

Наши пользователи обычно дают длинные имена папкам, которые они создают, а затем создают подпапки (тоже длинные) и больше подпапок... и больше подпапок....

У нас есть новый общий ресурс с большей емкостью, и с помощью летучей мыши simpe robocopy мы скопировали все файлы и папки (некоторые создают проблемы, но мы копировали их вручную)

Но проблема заключается в их удалении. Команда del не работала хорошо, когда такие длинные пути, neirder rmdir... Я пробовал некоторых командиров, но не повезло.

Можете ли вы порекомендовать мне какой-либо инструмент, который может рекурсивно удалить или может удалить более 255 путей?

Отредактировано: SO на фоне общего ресурса - это ОС NetApp. Но я могу получить к нему доступ с серверов 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 символов (представьте себе перед сценарием).

7 ответов

Решение

Это программа 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 здесь (4 КБ).

Попробуйте для /f "delims=" %a in ('dir /ad /b') сделать rm / s / q "% a" - он рекурсивно и без запроса удалит все подкаталоги текущего каталога, перечисленные в dir / ad / б вывод

Если этот общий ресурс является единственным в разделе, то было бы проще просто переформатировать его.

Если на разделе есть что-то, что стоит сохранить, просто скопируйте его куда-нибудь, переформатируйте и скопируйте обратно.

Вы пробовали WinDirStat? Я не уверен насчет лимита 255, поскольку он выдает команды Windows для удаления, но это может помочь вам разобраться в беспорядке.

Очень полезный инструмент в противном случае

Что произойдет, если вы используете опцию / move в robocopy? Это позволит удалить файлы из источника после копирования.

Попробуйте использовать "deltree". Я сейчас использую только Linux, но я рекомендую сделать "deltree /?" первый!

Что делать, если вы использовали ROBOCOPY с /MIR флаг для зеркалирования пустой папки поверх ненужных файлов? Если он достаточно умен, чтобы копировать файлы с длинными именами, он должен быть достаточно умен, чтобы удалить их.

 MKDIR empty
 ROBOCOPY empty <dest> /MIR

Хотя возможно, что это не будет дальше, чем предложение Криса.

Другие вопросы по тегам