Comment scp / tar fichiers qui sont entre des jours spécifiques?

8

J'ai besoin de copier les fichiers journaux db entre deux serveurs suse où je suis intéressé par les fichiers UNIQUEMENT entre le 10.3.2013 et le 13.3.2013

Il est souhaitable de compresser les fichiers avant de les copier, donc je les tar et scp. Actuellement, j'utilise tar -cvzf /tmp/saas_archive_logs.tar.gz /var/lib/edumate/backup/archive_logs/db2inst1/SAAS --newer-mtime=2013-03-10qui me donne tous les fichiers du 10.3.2013 jusqu'à maintenant. Mais je n'ai pas besoin de tous. Et je n'ai trouvé aucun commutateur tar.

Radek
la source

Réponses:

12

Comme Bichoy l'a indiqué, vous pouvez utiliser la findcommande pour rechercher des fichiers avec un temps d'accès, de création et de modification spécifique. Cependant, -mtime prend un décalage par incréments de 24 heures et n'est pas toujours pratique à calculer à moins que vous ne vouliez quelque chose d'un certain nombre de jours. Vous devrez combiner cela avec -daystartpour «arrondir» cela au début de la journée.

Je pense que plus pratique dans votre cas, est l'option -newermt qui prend une chaîne de données (et non le nom d'un fichier de référence comme la plupart des versions -newerXY)

Combinez cela avec findl' -print0option de pour gérer les fichiers avec des espaces dans le nom et éventuellement -type fpour ne pas obtenir de répertoires dans la période qui vous intéresse:

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 

Il y a un gros problème avec cela: au cas où le nombre de fichiers trouvés deviendrait trop long, xargsinvoquerait sa commande (dans ce cas tar) plusieurs fois selon les xargsbesoins pour ajuster les arguments sur la ligne de commande qui n'est pas infinie. Pour contourner cela, j'utilise toujours cpio, qui lit les noms de fichiers depuis stdin. Avec le --format=ustarparamètre pour obtenir un fichier tar POSIX, et dans votre cas, vous devrez diriger la sortie gzippour obtenir le résultat souhaité:

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
Anthon
la source
Puis-je spécifier des heures et des minutes lors de l'utilisation de votre code?
Radek
J'ai essayé avant de poster mon commentaire mais ... "trouver: je ne peux pas comprendre comment interpréter` 201302050000 'comme une date ou une heure "
Radek
@Radek La réponse courte est oui. J'utiliserais YYYYMMDDThhmm pour ne pas avoir à gérer les espaces. La réponse longue: man find vous le dira: les spécifications de temps sont interprétées comme pour l'argument de l'option -d de la date GNU et avec man date vous trouverez... 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 merci d'avoir signalé l'erreur, car je n'ai pas pu modifier mon commentaire, j'ai réinséré un nouveau avec un Tinséré entre les jours et les heures. Que j'ai testé et fonctionne. D'une manière ou d'une autre, findil ne sait pas comment diviser la chaîne autrement (probablement parce qu'il pourrait s'agir de YYMMDDhhmmss au lieu de YYYYMMDDhhmm. Je pensais que la date aurait besoin d'un point pour les secondes ( .ss) mais c'est probablement uniquement pour régler la date.
Anthon
4

Vous pouvez vérifier la findcommande pour obtenir une liste des fichiers à tarer. Vous pouvez spécifier une date de début et de fin (jusqu'à précision des secondes) à l' aide de la normale -atime, -btime, -mtime... arguments en combinaison avec l' -notargument. Vous pouvez ensuite diriger la sortie vers xargspuis vers tar. Consultez la page de manuel de findpour plus de détails sur les arguments de temps.

Mise à jour: Comme suggéré par Anthon, vous pouvez utiliser les modificateurs +/- avec -mtimepour spécifier la période sans utiliser -not. Voici un exemple:

find . -mtime -5d2h3m10s -mtime +4d0h15m20s -print0 | xargs -0 tar cjvf mytar.tar.bz2

d, h, m, scorrespond respectivement aux jours, heures, minutes et secondes . Cela donnera des fichiers modifiés plus récents 5d2h3m10set plus anciens que4d0h15m20s

Bichoy
la source
2
l'argument to -mtimedoit être un décalage en jours qui ne l'est pas toujours sauf si vous ce décalage est fixé entre les temps d'exécution. Vous pouvez également utiliser -mtime +Xet -mtime -Xpour spécifier avant et après il y a X jours au lieu d'utiliser -not.
Anthon
Quelle serait la syntaxe pour spécifier la date et l'heure absolues?
Radek