Enumere los directorios creados en los últimos 3 días y muestre el uso del espacio

Enumere los directorios creados en los últimos 3 días y muestre el uso del espacio

Como parte de la limpieza del disco, ahora debo eliminar todas las carpetas y su contenido creado en los últimos 3 días (no la fecha hábil actual):

Ejemplo: la fecha de hoy es 20191121, entonces:

/opt/png/wsm/data/workdir/batch/*20191120*
/opt/png/wsm/data/workdir/batch/*20191119*
/opt/png/wsm/data/workdir/batch/*20191118*

Todo lo que puedo hacer ahora es obtener la lista:

ls -d */ | grep 20191118 (and then 19 and 20)

¿Cómo puedo comprobar cuánto tamaño puedo ahorrar eliminando una carpeta con fecha concreta y su contenido?

La versión de bash en el servidor es:

bash-3.2$ bash --version
GNU bash, version 3.2.57(1)-release (i386-pc-solaris2.10)
Copyright (C) 2007 Free Software Foundation, Inc.

Respuesta1

Al limpiar archivos y carpetas, es posible que desee utilizar el ducomando.

duenumera el uso del espacio en la unidad,tiene una --timeopción, y se puede utilizarsolo para directorios. Combinándolos:

du -h */ --time | grep -E '2019\-09\-(18|19|20)'

Esto tomará cualquier subdirectorio cuyo contenido haya sido creado o modificado por última vez el 18, 19 o 20 de noviembre. Mostrará el tamaño ( -hlegible por humanos), la fecha de modificación y, finalmente, la ruta.

Respuesta2

La respuesta anterior fallará si los directorios que intenta rm contienen más de 5000 archivos. Esto le dejará con directorios antiguos no eliminados.

Utilice buscar en su lugar con "-exec rm {} \+" que llamará a rm una o más veces con un máximo de 5000 argumentos para cada llamada.

Para buscar archivos/directorios modificados, utilice buscar

find . -type d -atime n  # for exact number of days
find . -type d -atime +n  # for greater than n days

Puede agregar la opción -daystart para medir los tiempos desde el comienzo de hoy en lugar de hace 24 horas.

Luego, use "-exec rm {} \+" para eliminar o "-exec du -sh {} \;" para obtener el uso del disco de cada directorio.

Considere también la opción -max Depth para las llamadas find + du para limitar la búsqueda a directorios en el nivel superior.

Consulte "man find" para obtener más información (desde la terminal (mejor) o desde man7.org para obtener una página de manual actualizada:http://man7.org/linux/man-pages/man1/find.1.html, pero no de Die.net (incluso eliminan las marcas de tiempo de las páginas para que no sepas sus páginas de manual o sus años de antigüedad y desactualización)).

Respuesta3

Luego, una sintaxis mucho más corta y (desde mi punto de vista) más legible para la solución @Kusalananda, y usando fecha en lugar de gdate (aunque ¿quizás gdate sea una fecha equivalente en Solaris?):

days=$(echo -e "1 day ago \n 2 days ago \n 3 days ago" | date -f - +'%Y%m%d')
dpath="/opt/png/wsm/data/workdir/batch"
for day in $days ; do
    du -s -h "$dpath/$day"
    rm -r -f "$dpath/$day"
done

Respuesta4

Si su sistema Solaris tiene bash, normalmente también tendrá zsh.

Dado que ese formato de fecha se ordena como números, puede usar <start-end>el operador global de rango de números decimales de zsh:

zsh -c '
  zmodload zsh/datetime
  now=$EPOCHSECONDS day=$(( 24 * 60 * 60 ))
  for var t (start $(( now - 3*day )) end $(( now - 1*day )) )
    strftime -s $var %Y%m%d $t
  range="<$start-$end>"
  rm -rf -- *$~range*(/)
'

Tenga en cuenta que si se ejecuta en el día equivocado del año en medio de la noche al cambiar del/al horario de verano, restar 24*60*60 segundos de la hora actual podría llevarlo al mismo día o hace 2 días.

Para obtener el cuso acumulativo del disco de esos directorios, reemplácelo rm -rfcon du -c. Si esa es la cantidad de espacio que se recuperará después de eliminarlos depende de si algún archivo en esos directorios tiene enlaces duros en otros lugares o no.

información relacionada