我们这里有一个小问题。
我们共享所有服务器办公室的备份,这个共享非常大,有超过 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 命令来执行删除操作,但它可能会帮助您更轻松地理清混乱。
非常有用的工具