Confus par cette commande `find` dans un script Bash?

8

J'ai un script bash, créé par quelqu'un qui n'est plus en mesure d'expliquer la signification, qui est utilisé pour tarer automatiquement un dossier et le sauvegarder. Pour le moment, je suis confus avec la dernière ligne:

find '/home/_backups/pokebrawl' -mtime +6 -type f -delete

Le script complet est ci-dessous.

#!/bin/bash
#Purpose = Backup of Important Data
#Created on 17-1-2012
#Author = Hafiz Haider
#Version 1.0
#START
TIME=$(date +"%m-%d-%Y-%T")
FILENAME=pokebrawl-$TIME.tar.gz
SRCDIR=/home/servers/brawl/world
DESDIR=/home/_backups/pokebrawl
tar -cpzf $DESDIR/$FILENAME $SRCDIR
find '/home/_backups/pokebrawl' -mtime +6 -type f -delete
#END
MODS Supprimer le compte
la source
3
Aucune question de suivi, une question par question. Vous pouvez poser autant de questions que vous le souhaitez. Par conséquent, cliquez sur poser une question, puis posez une autre question, ne l'ajoutez pas au bas d'une autre.
ctrl-alt-delor

Réponses:

11

La findcommande supprimera tout fichier normal dans ou en dessous du /home/_backups/pokebrawlrépertoire datant de plus de sept jours (ou plus précisément, non modifié au cours de la dernière semaine).

Il faut probablement lire

find "$DESDIR" -mtime +6 -type f -delete

ou

find "${DESDIR:?Not set correctly}" -mtime +6 -type f -delete

car il existe une variable parfaitement bonne contenant déjà ce nom de répertoire. La deuxième variation entraînerait une erreur si, DESDIRpour une raison quelconque, était vide ou non défini.

Je suppose que c'est un moyen de conserver uniquement la valeur de la semaine dernière de sauvegardes. Je suggérerais d'utiliser quelque chose comme borgbackupou à la resticplace, car ceux-ci pourraient garder les sauvegardes beaucoup plus longtemps sans utiliser beaucoup plus d'espace (même les sauvegardes horaires pendant un an ne prendraient pas beaucoup d'espace si les données ne changeaient pas beaucoup) . Ils font la déduplication des données et borgbackupprennent également en charge la compression (les deux prennent également en charge les sauvegardes à distance et le chiffrement).

Pour exécuter le script toutes les 24 heures (à minuit), utilisez une tâche cron.

Commencez par exécuter la commande crontab -e. Cela ouvrirait un éditeur avec la crontab actuelle pour l'utilisateur actif (cela peut ou non être un fichier vide).

Puis ajouter

@daily /path/to/the/script.sh

(où path/to/the/script.shest le chemin d'accès du script).

Enregistrez et quittez l'éditeur.

Le script serait désormais appelé à minuit, même la nuit.

Souhaitez-vous exécuter le script à, disons, 13h30 tous les après-midi, ajoutez ce qui suit comme entrée crontab à la place:

30 13 * * * /path/to/the/script.sh

Consultez le manuel de crontab sur votre système pour plus de détails sur la façon d'écrire un programme crontab ( man 5 crontab).

Kusalananda
la source
1
Sur le point Il devrait probablement être lu : certains scripteurs évitent délibérément d'utiliser une variable d'environnement lors de ce type d' opération find/ delete, au cas où certains doofus oublient de la définir $DESDIRou la définissent sur "/" ou quelque chose de ce genre par erreur.
steve
@steve Eh bien, si elle DESDIRest modifiée et que la findcommande n'est pas mise à jour, elle ne parviendra pas à nettoyer le bon répertoire. Il serait peut-être utile d'utiliser à la place ${DESDIR:?Not set correctly}ou quelque chose de similaire.
Kusalananda
5
find '/home/_backups/pokebrawl' -mtime +6 -type f -delete

Cela trouve tous les fichiers du répertoire /home/_backups/pokebrawlqui n'ont pas été modifiés au cours des derniers +6jours et les supprime. REMARQUE: +6équivaut à 7 jours.

Regardez man findpour voir comment ces commutateurs fonctionnent:

$ man find
...
   -mtime n
          File's data was last modified n*24 hours ago.  See the comments 
          for -atime to understand how rounding affects the interpretation 
          of file modification times.

Sur les distributions Redhat, vous pouvez simplement mettre ce script dans le répertoire /etc/crondailyet il s'exécutera tous les jours. Vous pouvez voir qu'il existe déjà d'autres scripts que vous pouvez utiliser comme exemples:

$ sudo ls -l /etc/cron.daily/
total 12
-rwx------. 1 root root 219 Aug  1  2017 logrotate
-rwxr-xr-x. 1 root root 618 Mar 17  2014 man-db.cron
-rwx------. 1 root root 208 Nov  4  2016 mlocate
slm
la source