Files

大量子文件夾和長子文件夾。我怎樣才能刪除所有這些?

  • August 30, 2014

我們這裡有個小問題。

我們與所有伺服器辦公室的備份共享,它是一個非常大的共享,包含超過 8.000.000 個文件。

我們的使用者通常給他們創建的文件夾起長名稱,然後製作子文件夾(也很長)和更多的子文件夾……以及更多的子文件夾……

我們有一個容量更大的新共享,我們使用簡單的 robocopy bat 複製了所有文件和文件夾(有些會出現問題,但我們手動複製了它們)

但問題是刪除它們。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 個字元的完整路徑(想像一下在腳本之前)。

這是dot_deltree.csC# 中的一個程序,可刪除任意深度的目錄樹。它的工作原理是首先將太深的目錄移動到最淺目錄中的隨機名稱。

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 "";
   }
}

gmcs dot_deltree.cs使用用於 .NET 2.0 的Mono C# 編譯器編譯在這裡(4kb)。

引用自:https://serverfault.com/questions/230119