Aquí está mi solución, recién salida del horno, lo bonito del código es la función "dirname"
que obtiene el directorio en el cual se encuentra un archivo, la función utiliza recursividad y
expresión regular.
Miren:
C:\Users\leo>dirname c:\Users\leo\HijackThis.exe
[leo\]
C:\Users\leo>dirname "c:\Users\leo\Configuración local"
[leo\]
C:\Users\leo>dirname "c:\Users\leo\Desktop\BeJeweled 2 .lnk"
[Desktop\]
Obtiene el directorio en el cuál está el archivo. Esta función fue necesaria para la comparación entre el nombre de archivo y el directorio en el cual se encuentra el archivo.
Con esto he probado el código:
C:\Users\leo>cd test
C:\Users\leo\test>tree /f
Listado de rutas de carpetas para el volumen Descargas
El número de serie del volumen es 00000200 466D:2456
C:.
¦ lala.html
¦ log.txt
¦ test.cpp
¦ test.exe
¦ test1.txt
¦
+---algo
¦ .bash_history
¦ 10-easy-vim.pdf.zip
¦
+---test1
¦ test1.txt
¦
+---algo
.bash_history
10-easy-vim.pdf.zip
algo.bash_history
algo.zip
C:\Users\leo\test>
test.cpp y test.exe tienen 370 KB y están en el directorio test, por lo cual deben de eliminarse.
En el directorio test1, test1.txt debe ser eliminado porque tiene 6KB y se llama igual que su directorio.
En el directorio algo, algo.bash_history debe ser eliminado porque tiene 170KB y está en el directorio algo.
El script genera un log en el directorio test con la siguiente información:
No borrar ... lala.html, directorio : C:\Users\leo\test, size : 540KB
Borrar archivo ... test.cpp, directorio : C:\Users\leo\test, size : 370KB
Borrar archivo ... test.exe, directorio : C:\Users\leo\test, size : 370KB
No borrar ... test1.txt, directorio : C:\Users\leo\test, size : 1KB
No borrar ... .bash_history, directorio : C:\Users\leo\test\algo, size : 170KB
Borrar archivo ... test1.txt, directorio : C:\Users\leo\test\test1, size : 6KB
No borrar ... .bash_history, directorio : C:\Users\leo\test\test1\algo, size : 170KB
Borrar archivo ... algo.bash_history, directorio : C:\Users\leo\test\test1\algo, size : 170KB
@echo off
setlocal enabledelayedexpansion
cd ./test
set dir=%CD%
rem Analizar el directorio actual:
for /f "tokens=*" %%_ in ('dir /b /a-d *.exe') do (
set size=
call:size "%%_"
if !talla! lss 500 (
call:dirname %%~dp_
if "!shit!"=="%%~n_\" (
echo Borrar archivo ... %%_, directorio : !cd!, size : !talla!KB >> "%dir%\log.txt"
) else (
echo No borrar ... %%_, directorio : !cd!, size : !talla!KB >> "%dir%\log.txt"
)
) else (
echo No borrar ... %%_, directorio : !cd!, size : !talla!KB >> "%dir%\log.txt"
)
)
rem Analizar subdirectorios:
for /f "tokens=*" %%_ in ('dir /b /s /ad') do (
pushd "%%_"
for /f "tokens=*" %%f in ('dir /b /a-d *.exe') do (
set size=
call:size "%%f"
if !talla! lss 500 (
call:dirname %%~dpf
if "!shit!"=="%%~nf\" (
echo Borrar archivo ... %%f, directorio : %%_, size : !talla!KB >> "%dir%\log.txt"
) else (
echo No borrar ... %%f, directorio : %%_, size : !talla!KB >> "%dir%\log.txt"
)
)
)
popd
)
goto:eof
:size
set /a talla=%~z1 / 1024 + 1
goto:eof
:dirname
if "%~1"=="" goto:eof
for /f "tokens=1* delims=\" %%a in ("%~1") do (
set shit=%%b
echo %%b | findstr /R "\\.." > nul && call:dirname !shit!
)
Saludos.