Tengo una carpeta en la que hago una copia de seguridad de mis bases de datos y quiero eliminar todas las copias de seguridad creadas entre las 11 a. m. y las 3 p. m. y no importa qué día sea, ¡este es el truco!
Encontré este comando muy útil, pero no en mi caso de uso:
find . -type f -newermt '01 nov 2018 00:00:00' -not -newermt '10 nov 2018 00:00:00' -delete
¡Pero aquí me obliga a un intervalo entre dos fechas! Quiero eliminar solo las copias de seguridad creadas entre dos momentos específicos.
Respuesta aceptada:
Bastante simple, dado que etiquetó Linux, tiene el stat
comando disponible, que extraerá la hora de modificación de un archivo y la date
de GNU comando, que extraerá la hora de un momento dado:
find . -type f -exec sh -c '
h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]'
sh {} ; -ls
Si los resultados parecen correctos, entonces:
find . -type f -exec sh -c '
h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]'
sh {} ; -delete
Aquí hay una prueba con -ls
versión:
$ touch -d 'Wed Sep 12 11:00:01 EDT 2018' 11am
$ touch -d 'Wed Sep 12 12:00:02 EDT 2018' 12pm
$ touch -d 'Wed Sep 12 15:00:03 EDT 2018' 303pm
$ find . -type f -exec sh -c 'h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' sh {} ; -ls
1705096 0 -rw-r--r-- 1 user group 0 Sep 12 2018 ./11am
1705097 0 -rw-r--r-- 1 user group 0 Sep 12 2018 ./12pm
Crédito a Kusalananda por escribir la excelente respuesta que seguí, en:Comprender la opción -exec de `find`
Tenga en cuenta que no quiero el {} +
versión de find
aquí, como queremos el -exec
los resultados serán por archivo, de modo que solo eliminemos los archivos que coincidan con el intervalo de tiempo.
El script de shell incrustado tiene dos piezas principales:determinar la marca de tiempo de "hora" del archivo y luego devolver el éxito o el fracaso según el rango. La primera parte se realiza en dos piezas. A la variable se le asigna el resultado de la sustitución del comando; el comando debe leerse al revés:
$(stat -c %Y "$1")
— esta (segunda) sustitución de comando llama astat
en el$1
parámetro del script de shell incrustado;$1
fue asignado porfind
como uno de los nombres de ruta que encontró. La opción %Y delstat
El comando devuelve el tiempo de modificación en segundos desde la época.date -d @ ... +%-H
— esto toma los segundos desde la época de la sustitución del comando anterior y preguntadate
para darnos la porción de Horas de ese tiempo; el@
la sintaxis dicedate
que le estamos dando segundos desde la época como formato de entrada. Con el-
opción en el formato de salida de la fecha, le decimos a la fecha de GNU que no rellene el valor con cualquier cero inicial. Esto evita cualquier mala interpretación octal posterior.
Una vez que tenemos el $h
Hora variable asignada, usamos el operador condicional de bash [[
para preguntar si ese valor es mayor o igual a 11 y también estrictamente menor que 15.