No estoy seguro de si esto tiene la fecha pasada dentro del día actual o si solo lleva 30 o 31 días.
p.ej
Si la fecha actual es March 28th
, debe ser hace 1 mes February 28th
, pero ¿qué sucede cuando es March 30th
?
Guión
Quiero hacer una copia de seguridad de algunos archivos todos los días, la secuencia de comandos guardará estos archivos dentro de la fecha actual con el $(date +%Y%m%d)
formato, por ejemplo 20150603_bckp.tar.gz
, cuando llegue el próximo mes, elimine todos esos archivos dentro de 1 mes, excepto los archivos 1 y 15, así que esto es Mi Condición:
past_month = $(date -d "-1 month" +%Y%m%d)
day = $(date +%d)
if [ "$day" != 01 ] && [ "$day" != 15 ]
then
rm /path/of/files/${past_month}_bckp.tar.gz
echo "Depuration done"
else
echo "Keep file"
fi
Pero quiero saber, ¿qué sucederá cuando la fecha sea el 30, 31 o incluso el último ejemplo de febrero? ¿Mantendrá esos archivos? o eliminar los archivos del primer día?
Cuando sea el 31, la depuración se ejecutará, por lo que si el último mes solo tuvo 30 días, ¿esto eliminará el primer día del archivo?
Espero haberlo insinuado.
Respuestas:
- 1 month
restará uno del número del mes y luego, si la fecha resultante no es válida (February 30
por ejemplo), ajústela para que sea válida. AsíDecember 31 - 1 month
esDecember 1
, no es un día de noviembre, yMarch 31 - 1 month
esMarch 3
(a menos que se ejecute en un año bisiesto).Aquí hay una cita de la página de información para Gnu
date
(que es ladate
versión que implementa esta sintaxis), que incluye una buena sugerencia para hacer que la aritmética sea más robusta:Otra advertencia, también citada en la página de información:
fuente
date
implementación; en mi libro es semánticamente contra-intuitivo. - Gracias por señalar eso, es bueno saberlo.En lugar de confiar en los nombres de archivo para purgar sus archivos de copia de seguridad, estaría más seguro confiando en sus metadatos de tiempo.
Por ejemplo, puede eliminar todos los archivos de más de 30 días con este comando:
Como beneficio adicional, ejecutar esto todos los días le permitirá mantener sus archivos de respaldo en un mes continuo, lo que permite una mejor administración del espacio en disco.
Para guardar los archivos 1º o 15º, puede almacenarlos en otro directorio, actualizar el comando find con la opción -not -name.
fuente
Podría intentar ver cómo funciona la fecha de la siguiente manera:
Entonces, creo que según el mes pasado (no es el mes de marzo), disminuye el número de días desde el último mes desde el mes actual.
Puede probar la siguiente sintaxis para eliminar archivos anteriores a un número de días (en el ejemplo, por debajo de 31 días). Una línea para resolver el problema (esto es para un enfoque simple).
Para un enfoque más detallado, también puede hacer algo como esto: 1. Encontrar el número de días para el mes actual:
Encontrar el número de días para el último mes:
echo "$ (cal $ (fecha +% m) $ (fecha +% y) | egrep -v" $ (fecha +% y) | Su "| xargs | awk '{print $ NF}') -" $ ( cal $ (fecha -d "+1 mes atrás" +% m) $ (fecha +% y) | egrep -v "$ (fecha +% y) | Su" | xargs | awk '{print $ NF}') El | antes de Cristo
Entonces ahora encontramos la diferencia entre esos dos meses:
echo "$ (cal $ (fecha +% m) $ (fecha +% y) | egrep -v" $ (fecha +% y) | Su "| xargs | awk '{print $ NF}') -" $ ( cal $ (fecha -d "+1 mes atrás" +% m) $ (fecha +% y) | egrep -v "$ (fecha +% y) | Su" | xargs | awk '{print $ NF}') El | antes de Cristo
Ahora asignemos algunas variables a estos 3 pasos. Paso 1 Nombre de la variable: FCM Paso 2 Nombre de la variable: FLM Paso 3 Nombre de la variable: DCL
Verifique si $ DCL es igual a 0 (cero) y elimine en función de la diferencia entre $ FCM y $ FLM:
También puede agregar una variable a "/ ruta / a / folde / with / arhives /".
Conclusión: si desea eliminar archivos anteriores a un mes (exactamente), debe ajustar el número exacto de días, si está utilizando el comando "fecha" y "hace +1 mes".
fuente