¿Cómo scp/tar archivos que se encuentran entre días específicos?

¿Cómo scp/tar archivos que se encuentran entre días específicos?

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-10eso 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 findcomando 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 findla -print0opción de manejar archivos con espacios en el nombre y, opcionalmente, -type fno 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, xargsinvocará su comando (en este caso tar) varias veces según xargssea 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=ustarparámetro para obtener un archivo tar POSIX, y en su caso necesitaría canalizar la salida gzippara 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 findcomando 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 -notargumento. Luego puede canalizar la salida hacia xargsy luego hacia tar. Consulte la página de manual de findpara obtener detalles sobre los argumentos de tiempo.

Actualizar: Como sugirió Anthon, puede usar los modificadores +/- con -mtimepara 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, scorresponde adías, horas, minutosysegundosrespectivamente. Esto dará archivos modificados más nuevos 5d2h3m10sy más antiguos que4d0h15m20s

información relacionada