Verwirrt von diesem `find` Befehl in einem Bash Skript?

8

Ich habe ein Bash-Skript, das von jemandem erstellt wurde, der die Bedeutung nicht mehr erklären kann. Es wird zum automatischen TARing eines Ordners und zum Sichern verwendet. Im Moment bin ich verwirrt mit der letzten Zeile:

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

Das vollständige Skript finden Sie weiter unten.

#!/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 Konto löschen
quelle
3
Keine Anschlussfragen, eine Frage pro Frage. Sie können so viele Fragen stellen, wie Sie möchten. Klicken Sie daher auf Frage stellen und dann eine andere Frage. Fügen Sie sie nicht am Ende einer anderen Frage hinzu.
Strg-Alt-Delor

Antworten:

11

Der findBefehl löscht alle regulären Dateien in oder unter dem /home/_backups/pokebrawlVerzeichnis, die älter als sieben Tage sind (oder genauer gesagt, nicht innerhalb der letzten Woche geändert wurden).

Es sollte wahrscheinlich lesen

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

oder

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

da es eine vollkommen gute Variable gibt, die diesen Verzeichnisnamen bereits enthält. Die zweite Variante würde einen Fehler verursachen, wenn sie DESDIRaus irgendeinem Grund leer oder nicht gesetzt wäre.

Ich gehe davon aus, dass dies eine Möglichkeit ist, nur die Backups der letzten Woche zu speichern. Ich würde vorschlagen, etwas wie borgbackupoder resticstattdessen zu verwenden, da diese Backups viel länger aufbewahren können, ohne viel mehr Speicherplatz zu benötigen (selbst stündliche Backups für ein Jahr würden überhaupt nicht viel Speicherplatz beanspruchen, wenn sich die Daten nicht stark ändern würden). . Sie deduplizieren Daten und borgbackupunterstützen zusätzlich die Komprimierung (beide unterstützen auch Remote-Backups und Verschlüsselung).

Verwenden Sie einen Cron-Job, um das Skript alle 24 Stunden (um Mitternacht) auszuführen.

Geben Sie zunächst den Befehl ein crontab -e. Dies würde einen Editor mit der aktuellen Crontab für den aktiven Benutzer öffnen (dies kann eine leere Datei sein oder nicht).

Dann füge hinzu

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

(Wo path/to/the/script.shist der Pfadname des Skripts).

Speichern und beenden Sie den Editor.

Das Skript würde jetzt um Mitternacht aufgerufen, sogar nachts.

Wenn Sie das Skript beispielsweise jeden Nachmittag um 13:30 Uhr ausführen möchten, fügen Sie stattdessen Folgendes als crontab-Eintrag hinzu:

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

Weitere Informationen zum Schreiben eines Crontab-Zeitplans ( man 5 crontab) finden Sie im Crontab-Handbuch auf Ihrem System .

Kusalananda
quelle
1
Auf dem Es sollte wahrscheinlich Aspekt lesen : Ich habe gesehen, dass einige Skripter absichtlich die Verwendung einer Umgebungsvariablen vermeiden, wenn sie diese Art von find/ deleteOperation ausführen, falls ein Doofus vergisst, sie zu setzen $DESDIRoder sie versehentlich auf "/" oder so zu setzen.
Steve
@steve Nun, wenn DESDIRgeändert und der findBefehl nicht aktualisiert wird, kann das richtige Verzeichnis nicht bereinigt werden. Es wäre möglicherweise hilfreich, ${DESDIR:?Not set correctly}stattdessen etwas Ähnliches zu verwenden.
Kusalananda
5
find '/home/_backups/pokebrawl' -mtime +6 -type f -delete

Dadurch werden alle Dateien im Verzeichnis gefunden /home/_backups/pokebrawl, die in den letzten +6Tagen nicht geändert wurden, und gelöscht. HINWEIS: +6entspricht 7 Tagen.

Sehen Sie sich an man find, wie diese Schalter funktionieren:

$ 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.

In Redhat-Distributionen können Sie dieses Skript einfach in das Verzeichnis stellen /etc/crondailyund es wird jeden Tag ausgeführt. Sie können sehen, dass es dort bereits andere Skripte gibt, die Sie als Beispiele verwenden können:

$ 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
quelle