![Cómo mover registros antiguos: registros de MySQL](https://rvso.com/image/192244/C%C3%B3mo%20mover%20registros%20antiguos%3A%20registros%20de%20MySQL%20.png)
Necesito mover binlogs antiguos a un directorio y también comprimirlos antes de moverlos a una carpeta nueva.
Tengo una escasez de espacio por lo que nos enfrentamos a problemas.
El siguiente comando no funciona.
ls -t binlog* | tail -n +4 | xargs mv /path-to-directory
ls -t binlog* | tail -n +4 | xargs echo mv /path-to-directory
Respuesta1
Si REALMENTE no desea recurrir a logrotate, utilice find
no analizar la salida de ls
, mientras imprime la hora de modificación del último archivo encontrado en segundos desde 1970.01.01.
$ find ./* -maxdepth 0 -name "binlog*" -printf "%T@ %f\0" \
| sort -z -k 1 -r \
| cut -z -d " " -f2- \
| tail -z -n +4 \
| xargs -0 -I {} mv -f "{}" /path/to/directory/
Lo anterior supone GNU coreutils, que aceptan -z
( sort
y ) o ( ) para usar líneas delimitadas cut
por NUL, lo que significa que el código funciona correctamente incluso con nuevas líneas en los nombres de archivos.tail
-0
xargs
Si puede estar seguro de que no hay nuevas líneas en los nombres de los archivos, resulta que no necesita terminar cada archivo encontrado con un valor nulo ( \0
) porque está ordenando por líneas en el primer campo (horas de la última modificación de los archivos). ) que nunca contiene caracteres problemáticos. Puedes simplificar lo anterior a:
$ find ./* -maxdepth 0 -name "binlog*" -printf "%T@ %f\n" \
| sort -k 1 -r \
| cut -d " " -f2- \
| tail -n +4 \
| xargs -I {} mv -f "{}" /path/to/directory/