Назад | Перейти на главную страницу

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

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

У нас есть доля с резервным копированием всех серверных офисов. Это действительно большая доля с более чем 8 000 000 файлов.

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

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

Но проблема в том удаление их. Команда 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 символов (представьте, что до сценария).

Это программа 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кб).

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

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

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

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

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

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

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

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

 MKDIR empty
 ROBOCOPY empty <dest> /MIR

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