1 votes

travail cron pour supprimer les fichiers avec un nom spécifique

J'ai ceci dans ma crontab

0 3 \* \* \* mysqldump --host=10.100.100.3 --user=username --password=mypass --routines DBName | gzip > /tmp/mysqldumps/mydb.\`date +"\\%Y-\\%m-\\%d"\`.gz

maintenant je dois créer une autre tâche cron pour faire ce scénario en supposant que nous sommes le 3 mai 2011 Je veux supprimer le fichier qui a été créé il y a un mois. ex. rm mydb.2011-04-03.gz

Une idée sur la façon de générer cette tâche cron (comment générer le nom du fichier à supprimer) ?

9voto

hmontoliu Points 3633

Vous avez plusieurs options ; je vous en propose deux :

Supprimer le fichier par date (chaque jour, le répertoire de destination sera recherché pour les fichiers de plus d'un mois et les correspondances seront supprimées) :

10 3 * * * find /tmp/mysqldumps/ -maxdepth 1 -ctime +30 -exec rm {} \;

Supprimez le fichier par son nom :

10 3 * * * rm /tmp/mysqldumps/mydb.`date -d "last month" +'%Y-%m-%d.gz'`

Je préfère la première car elle est plus robuste. De plus, si la tâche cron de suppression ne fonctionne pas un jour pour une raison quelconque, le lendemain, la première commande fera l'affaire. Dans mon deuxième exemple, le fichier ne sera pas supprimé.

4voto

Lekensteyn Points 5981

Au lieu d'analyser le nom du fichier, vous pouvez également vérifier le temps de modification d'un fichier.

La commande suivante recherche dans le /tmp/mysqldumps répertoire. Les noms de fichiers commençant par mydb. et se terminant le .gz , datant de plus de 30 jours, sont supprimés.

find /tmp/mysqldumps -name 'mydb.*.gz' -mtime +30 -exec rm {} \;

2voto

dunxd Points 598

Vous pouvez supprimer les fichiers datant de plus de 30 jours, par exemple, en utilisant une commande telle que

rm -f `find /tmp/mysqldumps -mtime +30 -name mydb.\*.gz`

2 votes

Pas assez sûr, si le chemin contient des espaces (pas dans ce cas), le comportement est inattendu. Il vaut mieux utiliser l'option -exec opción.

0 votes

De plus (ce n'est probablement pas le cas), il est toujours préférable d'exécuter les commandes à l'intérieur de find (avec -exec) plutôt qu'à partir de la sortie de find comme vous l'avez proposé. Dans votre commande si find obtient plus de résultats que ARG_MAX vous rm ne fonctionne pas. Je sais que c'est plutôt improbable, mais ça m'est arrivé plus de deux fois :-)

0 votes

Utilisez xargs : find /tmp/mysqldumps -mtime +30 -name 'mydb.*.gz' -print0|xargs -0 -n 50 rm -f .... Cela délimitera les noms avec un null, que xargs choisira, et le -n 50 ne spécifie pas plus de 50 sur la ligne, donc pas de problème de dépassement de tampon de ligne de commande.

0voto

mgjk Points 856

Pour les cron jobs plus complexes que votre exemple, j'aime mettre les cron jobs dans scripts sous ~/cron/, ensuite je peux les commenter pour savoir qui les a écrit, pourquoi ils sont là et quand ils ont été installés.

Une façon de faire le calcul pour votre rendez-vous serait la suivante. Je ne l'incorporerais pas dans une ligne simple, même si je suis sûr que c'est possible avec des échappatoires multiples et autres :

printf "%d-%02d-%02d" `date +%Y` $((`date +%m`-1))  `date +%d`

(serverfault a avalé mes backticks... je pense les avoir fait apparaître)

IMHO, find est meilleur pour supprimer des fichiers. Recherchez les fichiers qui correspondent à votre modèle plus anciens que la date. C'est plus sûr et ça évite de laisser traîner des choses lors de coupures de courant prolongées.

Ça pourrait même avoir l'air propre en une seule ligne... Je vais chercher un exemple.


Aha, voici un exemple où les fichiers "noooo" et "omg" sont détruits à cause de quelque chose dans le répertoire ./findtest/ :

$ ls -R
.:
findtest  noooooo  omg

./findtest:
mydb- file is *  mydb-old-file.gz
$ rm `find ./findtest/ -name mydb*`
rm: cannot remove `./findtest/mydb-': No such file or directory
rm: cannot remove `file': No such file or directory
rm: cannot remove `is': No such file or directory
rm: cannot remove `findtest': Is a directory
$ ls -R
.:
findtest

./findtest:
mydb- file is *

Bonne façon :

$ find ./findtest/ -name mydb* -exec rm {} \;
$ ls -R
.:
findtest  noooooo  omg

./findtest:
$

2 votes

Si vous avez gnu date (et éventuellement d'autres), vous pouvez faire date -d 'last month' +'%Y-%m-%d' qui fera la même chose que votre printf (en haut) avec moins de processus et plus robuste. Soustrayez 1 du mois 1, janvier, et vous obtenez 0, ce qui donnera 2011-00-04, qui n'est pas valide. En laissant la date le faire pour vous, vous obtiendrez les bons résultats.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X