
Necesito copiar archivos de registro de base de datos entre dos servidores Suse donde estoy interesado en archivos SÓLO entre el 10.3.2013 y el 13.3.2013.
Se desea comprimir los archivos antes de copiarlos, así que los tar y scp. Actualmente estoy usando tar -cvzf /tmp/saas_archive_logs.tar.gz /var/lib/edumate/backup/archive_logs/db2inst1/SAAS --newer-mtime=2013-03-10
eso que me da todos los archivos desde el 10.3.2013 hasta ahora. Pero no los necesito todos. Y no encontré ningún interruptor de alquitrán.
Respuesta1
Como indicó Bichoy, puedes usar el find
comando para buscar archivos con un tiempo de acceso, creación y modificación específico. Sin embargo, -mtime toma un desplazamiento en incrementos de 24 horas y no siempre es conveniente calcularlo a menos que desee algo de una cantidad específica de hace "días". Deberá combinar eso con -daystart
"redondear" eso al comienzo del día.
Creo que lo más conveniente en su caso es la opción -newermt que toma una cadena de fecha (y no el nombre de un archivo de referencia como la mayoría de las versiones -newerXY)
Combine eso con find
la -print0
opción de manejar archivos con espacios en el nombre y, opcionalmente, -type f
no obtener ningún directorio en el período que le interesa:
find /var/lib/edumate/backup/archive_logs/db2inst1/SAAS \
-newermt 20130310 -not -newermt 20130314 -type f -print0 \
| xargs -0 tar -cvzf /tmp/saas_archive_logs.tar.gz
Hay un gran problema con eso: en caso de que la cantidad de archivos encontrados sea demasiado larga, xargs
invocará su comando (en este caso tar
) varias veces según xargs
sea necesario para ajustar los argumentos en la línea de comando, que no es infinita. Para evitarlo, siempre uso cpio
, que lee los nombres de archivos de la entrada estándar. Con el --format=ustar
parámetro para obtener un archivo tar POSIX, y en su caso necesitaría canalizar la salida gzip
para obtener el resultado deseado:
find /var/lib/edumate/backup/archive_logs/db2inst1/SAAS \
-newermt 20130310 -not -newermt 20130314 -type f -print0 \
| cpio --create --null --format=ustar \
| gzip > /tmp/saas_archive_logs.tar.gz
Respuesta2
Puede consultar el find
comando para obtener una lista de los archivos que deben tararse. Puede especificar una fecha de inicio y finalización (con una precisión de hasta segundos) utilizando los argumentos normales -atime
, -btime
, -mtime
... en combinación con el -not
argumento. Luego puede canalizar la salida hacia xargs
y luego hacia tar
. Consulte la página de manual de find
para obtener detalles sobre los argumentos de tiempo.
Actualizar:
Como sugirió Anthon, puede usar los modificadores +/- con -mtime
para especificar el período sin usar -not
. Aquí hay un ejemplo:
find . -mtime -5d2h3m10s -mtime +4d0h15m20s -print0 | xargs -0 tar cjvf mytar.tar.bz2
donde d, h, m, s
corresponde adías, horas, minutosysegundosrespectivamente. Esto dará archivos modificados más nuevos 5d2h3m10s
y más antiguos que4d0h15m20s