¿Cómo scp / tar archivos que se encuentran entre días específicos?
8
Necesito copiar archivos de registro de db entre dos servidores suse donde estoy interesado en archivos SOLAMENTE 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 me da todos los archivos desde el 10.3.2013 hasta ahora. Pero no los necesito a todos. Y no encontré ningún interruptor de alquitrán.
Como Bichoy indicó, puede usar el findcomando para buscar archivos con un tiempo específico de acceso, creación y modificación. 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 números de 'días' atrás. Tendrá que combinar eso con -daystart'redondear' eso al comienzo del día.
Creo que 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 interese:
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 el número de archivos encontrados sea demasiado largo, xargsinvocará su comando (en este caso tar) varias veces según sea xargsnecesario para ajustar los argumentos en la línea de comando que no es infinito. Para eludir eso siempre uso cpio, que lee los nombres de archivo de stdin. 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:
¿Puedo especificar horas y minutos al usar su código?
Radek
Lo intenté antes de publicar mi comentario pero ... "encontrar: no puedo entender cómo interpretar '201302050000' como una fecha u hora"
Radek
@Radek La respuesta corta es sí. Usaría AAAAMMDDThhmm para no tener que lidiar con espacios. La respuesta larga: man find le dirá: Las especificaciones de tiempo se interpretan como el argumento de la opción -d de la fecha GNU y con la fecha man encontrará... a mostly free format human readable date string ..... A date string may contain items indicating calendar date, time of day, time zone, day of week, relative time, relative date, and numbers
Anthon
@Radek, gracias por señalar el error, ya que no pude editar mi comentario, volví a insertar uno nuevo Tinsertado entre los días y las horas. Eso lo probé y funciona. De alguna manera find, no sabe cómo dividir la cadena (probablemente porque podría ser YYMMDDhhmmss en lugar de YYYYMMDDhhmm. Pensé que esa fecha necesitaría un punto por los segundos ( .ss), pero eso es probablemente solo para establecer la fecha.
Anthon
4
Puede verificar el findcomando para obtener una lista de los archivos que deben ser tarados. Puede especificar una fecha de inicio y fin (hasta segundo de precisión), utilizando los normales -atime, -btime, -mtime... argumentos 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.
Actualización:
como sugirió Anthon, puede usar los modificadores +/- con -mtimepara especificar el período sin usar -not. Aquí hay un ejemplo:
Donde d, h, m, scorresponde a días, horas, minutos y segundos respectivamente. Esto dará archivos modificados más nuevos 5d2h3m10sy más antiguos que4d0h15m20s
el argumento -mtimetiene que ser un desplazamiento en días que no siempre es así, a menos que ese desplazamiento esté fijado entre tiempos de ejecución. También puede usar -mtime +Xy -mtime -Xespecificar antes y después de X días atrás en lugar de usar -not.
Anthon
¿Cuál sería la sintaxis para especificar la fecha y hora absolutas?
... a mostly free format human readable date string ..... A date string may contain items indicating calendar date, time of day, time zone, day of week, relative time, relative date, and numbers
T
insertado entre los días y las horas. Eso lo probé y funciona. De alguna manerafind
, no sabe cómo dividir la cadena (probablemente porque podría ser YYMMDDhhmmss en lugar de YYYYMMDDhhmm. Pensé que esa fecha necesitaría un punto por los segundos (.ss
), pero eso es probablemente solo para establecer la fecha.Puede verificar el
find
comando para obtener una lista de los archivos que deben ser tarados. Puede especificar una fecha de inicio y fin (hasta segundo de precisión), utilizando los normales-atime
,-btime
,-mtime
... argumentos en combinación con el-not
argumento. Luego puede canalizar la salida haciaxargs
y luego haciatar
. Consulte la página de manual defind
para obtener detalles sobre los argumentos de tiempo.Actualización: como sugirió Anthon, puede usar los modificadores +/- con
-mtime
para especificar el período sin usar-not
. Aquí hay un ejemplo:Donde
d, h, m, s
corresponde a días, horas, minutos y segundos respectivamente. Esto dará archivos modificados más nuevos5d2h3m10s
y más antiguos que4d0h15m20s
fuente
-mtime
tiene que ser un desplazamiento en días que no siempre es así, a menos que ese desplazamiento esté fijado entre tiempos de ejecución. También puede usar-mtime +X
y-mtime -X
especificar antes y después de X días atrás en lugar de usar -not.