Saltar al contenido

Archivo por lotes para eliminar archivos con más de N días

Solución:

Disfrutar:

forfiles -p "C:whatever" -s -m *.* -d <number of days> -c "cmd /c del @path"

Ver forfiles documentación para más detalles.

Para más golosinas, consulte Un índice AZ de la línea de comandos de Windows XP.

Si no tienes forfiles instalado en su máquina, cópielo desde cualquier Windows Server 2003 a su máquina Windows XP en %WinDir%system32. Esto es posible porque el EXE es totalmente compatible entre Windows Server 2003 y Windows XP.

Las versiones posteriores de Windows y Windows Server lo tienen instalado de forma predeterminada.

Para Windows 7 y versiones posteriores (incluido Windows 10):

La sintaxis ha cambiado un poco. Por lo tanto, el comando actualizado es:

forfiles /p "C:whatever" /s /m *.* /D -<number of days> /C "cmd /c del @path"

Ejecute los siguientes comandos:

ROBOCOPY C:source C:destination /mov /minage:7
del C:destination /q

Mueva todos los archivos (usando / mov, que mueve archivos y luego los elimina en lugar de / move que mueve árboles de archivos completos que luego se eliminan) a través de robocopy a otra ubicación, y luego ejecute un comando de eliminación en esa ruta y estará todo bueno.

Además, si tiene un directorio con muchos datos, puede usar /mir cambiar

Ok estaba un poco aburrido y se le ocurrió esto, que contiene mi versión del reemplazo de época de Linux de un hombre pobre limitado para uso diario (sin retención de tiempo):

7daysclean.cmd

@echo off
setlocal ENABLEDELAYEDEXPANSION
set day=86400
set /a year=day*365
set /a strip=day*7
set dSource=C:temp

call :epoch %date%
set /a slice=epoch-strip

for /f "delims=" %%f in ('dir /a-d-h-s /b /s %dSource%') do (
    call :epoch %%~tf
    if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)
)
exit /b 0

rem Args[1]: Year-Month-Day
:epoch
    setlocal ENABLEDELAYEDEXPANSION
    for /f "tokens=1,2,3 delims=-" %%d in ('echo %1') do set Years=%%d& set Months=%%e& set Days=%%f
    if "!Months:~0,1!"=="0" set Months=!Months:~1,1!
    if "!Days:~0,1!"=="0" set Days=!Days:~1,1!
    set /a Days=Days*day
    set /a _months=0
    set i=1&& for %%m in (31 28 31 30 31 30 31 31 30 31 30 31) do if !i! LSS !Months! (set /a _months=!_months! + %%m*day&& set /a i+=1)
    set /a Months=!_months!
    set /a Years=(Years-1970)*year
    set /a Epoch=Years+Months+Days
    endlocal& set Epoch=%Epoch%
    exit /b 0

USO

set /a strip=day*7 : Cambio 7 por el número de días a conservar.

set dSource=C:temp : Este es el directorio de inicio para buscar archivos.

NOTAS

Este es un código no destructivo, mostrará lo que hubiera sucedido.

Cambio :

if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)

a algo como:

if !epoch! LEQ %slice% del /f %%f

para que los archivos realmente se eliminen

febrero: está codificado en 28 días. Los años bissextiles son un infierno para agregar, de verdad. si alguien tiene una idea que no agregaría 10 líneas de código, adelante y publíquela para que la agregue a mi código.

época: No tomé en consideración el tiempo, ya que la necesidad es eliminar archivos anteriores a una fecha determinada, tomar horas / minutos habría eliminado archivos de un día que estaba destinado a conservar.

LIMITACIÓN

época da por sentado que su formato de fecha corta es AAAA-MM-DD. Debería adaptarse para otras configuraciones o una evaluación en tiempo de ejecución (lea sShortTime, configuración vinculada al usuario, configure el orden de campo adecuado en un filtro y use el filtro para extraer los datos correctos del argumento).

¿Mencioné que odio el formato automático de este editor? elimina las líneas en blanco y copiar y pegar es un infierno.

Espero que esto ayude.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *