Aqui está um pequeno aplicativo que usa amostragem profunda para encontrar tumores em qualquer disco ou diretório. Ele percorre a árvore de diretórios duas vezes, uma vez para medi-la e a segunda vez para imprimir os caminhos para 20 bytes "aleatórios" no diretório.
void walk(string sDir, int iPass, int64& n, int64& n1, int64 step){
foreach(string sSubDir in sDir){
walk(sDir + "/" + sSubDir, iPass, n, n1, step);
}
foreach(string sFile in sDir){
string sPath = sDir + "/" + sFile;
int64 len = File.Size(sPath);
if (iPass == 2){
while(n1 <= n+len){
print sPath;
n1 += step;
}
}
n += len;
}
}
void dscan(){
int64 n = 0, n1 = 0, step = 0;
// pass 1, measure
walk(".", 1, n, n1);
print n;
// pass 2, print
step = n/20; n1 = step/2; n = 0;
walk(".", 2, n, n1);
print n;
}
A saída fica assim no meu diretório Arquivos de Programa:
7,908,634,694
.\ArcSoft\PhotoStudio 2000\Samples\3.jpg
.\Common Files\Java\Update\Base Images\j2re1.4.2-b28\core1.zip
.\Common Files\Wise Installation Wizard\WISDED53B0BB67C4244AE6AD6FD3C28D1EF_7_0_2_7.MSI
.\Insightful\splus62\java\jre\lib\jaws.jar
.\Intel\Compiler\Fortran\9.1\em64t\bin\tselect.exe
.\Intel\Download\IntelFortranProCompiler91\Compiler\Itanium\Data1.cab
.\Intel\MKL\8.0.1\em64t\bin\mkl_lapack32.dll
.\Java\jre1.6.0\bin\client\classes.jsa
.\Microsoft SQL Server\90\Setup Bootstrap\sqlsval.dll
.\Microsoft Visual Studio\DF98\DOC\TAPI.CHM
.\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\v1.0.5000\Windows CE\sqlce20sql2ksp1.exe
.\Microsoft Visual Studio .NET 2003\SDK\v1.1\Tool Developers Guide\docs\Partition II Metadata.doc
.\Microsoft Visual Studio .NET 2003\Visual Studio .NET Enterprise Architect 2003 - English\Logs\VSMsiLog0A34.txt
.\Microsoft Visual Studio 8\Microsoft Visual Studio 2005 Professional Edition - ENU\Logs\VSMsiLog1A9E.txt
.\Microsoft Visual Studio 8\SmartDevices\SDK\CompactFramework\2.0\v2.0\WindowsCE\wce500\mipsiv\NETCFv2.wce5.mipsiv.cab
.\Microsoft Visual Studio 8\VC\ce\atlmfc\lib\armv4i\UafxcW.lib
.\Microsoft Visual Studio 8\VC\ce\Dll\mipsii\mfc80ud.pdb
.\Movie Maker\MUI\0409\moviemk.chm
.\TheCompany\TheProduct\docs\TheProduct User's Guide.pdf
.\VNI\CTT6.0\help\StatV1.pdf
7,908,634,694
Diz-me que o diretório é 7,9gb, dos quais
- ~ 15% vai para o compilador Intel Fortran
- ~ 15% vai para o VS .NET 2003
- ~ 20% vai para o VS 8
É simples o suficiente perguntar se algum deles pode ser descarregado.
Ele também fala sobre os tipos de arquivos distribuídos pelo sistema de arquivos, mas juntos representam uma oportunidade para economizar espaço:
- ~ 15% aproximadamente vai para arquivos .cab e .MSI
- ~ 10% vai para o registro de arquivos de texto
Ele mostra muitas outras coisas lá também, que eu provavelmente poderia prescindir, como suporte a "SmartDevices" e "ce" (~ 15%).
Leva tempo linear, mas não precisa ser feito com frequência.
Exemplos de coisas que encontrou:
- cópias de backup de DLLs em muitos repositórios de código salvos, que realmente não precisam ser salvos
- uma cópia de backup do disco rígido de alguém no servidor, em um diretório obscuro
- arquivos de internet temporários volumosos
- arquivos antigos de documentos e ajuda há muito tempo sendo necessários