Files
大量子文件夾和長子文件夾。我怎樣才能刪除所有這些?
我們這裡有個小問題。
我們與所有伺服器辦公室的備份共享,它是一個非常大的共享,包含超過 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.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 ""; } }
gmcs dot_deltree.cs
使用用於 .NET 2.0 的Mono C# 編譯器編譯在這裡(4kb)。