У нас тут небольшая проблема.
У нас есть доля с резервным копированием всех серверных офисов. Это действительно большая доля с более чем 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
Хотя, возможно, дальше предложения Криса это не пойдет.