Ich versuche, ein Skript zu erstellen, um mysqldumps täglich in einem Verzeichnis zu erstellen, sowie alle Sicherungen in diesem Verzeichnis zu überprüfen und alle älteren als 7 Tage zu entfernen, die auf Cron ausgeführt werden.Wie bekomme ich Echo, um nur gelöschte Dateipfade zu drucken?
So funktionieren meine Funktionen korrekt, es ist nur mein letzter Echo-Befehl, der nicht tut, was ich will. Das ist, was ich habe, so weit:
DBNAME=database
DATE=`date +\%Y-\%m-\%d_\%H\%M`
SQLFILE=$DBNAME-${DATE}.sql
curr_dir=$1
#MAIN
mysqldump -u root -ppassword --databases $DBNAME > $SQLFILE
echo "$SQLFILE has been successfully created."
#Remove files older than 7 days
for filepath in "$curr_dir"*
do
find "$filepath" -mtime +7 -type f -delete
echo "$filepath has been deleted."
done
exit
So sind die Backup-Kreationen und Entfernen von alten Dateien arbeiten beide. Aber, mein Problem ist, dass echo "$filepath has been deleted."
alle Dateien im Verzeichnis statt nur die Dateien, die älter als 7 Tage sind, die gelöscht wurden, druckt. Wo gehe ich hier falsch?
EDIT (Full-Lösung): mit jeder Beratung durch die Antworten und Kommentare
Dies ist die vollständige Lösung, die für mich in Liquidation arbeiten. Dies funktioniert für Cron-Jobs. Ich musste den Ausgabedateipfad der Hauptfunktion angeben, da die Dateien im Stammverzeichnis erstellt wurden und nicht im Pfad, der in Argument $ 1 angegeben wurde.
Vielen Dank für die Hilfe! Die if-Anweisung prüft auch, ob oder nicht mehr als $ 1 das angegebene Verzeichnis I-Dateien möchte gelöscht werden
#Variables
DBNAME=database
DATE=`date +\%Y-\%m-\%d_\%H\%M`
SQLFILE=$DBNAME-${DATE}.sql
curr_dir=$1
#MAIN
mysqldump -u root -ppassword --databases $DBNAME > /path/to/db-backups/directory/$SQLFILE
echo "$SQLFILE has been successfully created."
#Remove files older than 7 days
for filepath in "$curr_dir"*
do
if [[ $1 = "/path/to/db-backups/directory" ]]; then
find "$filepath" -mtime +7 -type f -delete -exec sh -c 'printf "%s has been deleted.\n" "[email protected]"' _ {} +
fi
done
exit
Ich weiß nicht bash, aber es sieht aus wie Ihre 'FOR' Schleife sagt "Wenn der Dateipfad älter als 7 Tage ist, dann d elete es, und dann, unabhängig davon, ob die Datei gelöscht wird, sagen wir, $ filepath wurde gelöscht. "Sie können auch eine Art" if "-Block oder etwas hinzufügen, um das Echo-Stück zu begrenzen. – phroureo
Eine Möglichkeit zu tun, was @phroureo korrekt vorschlägt, ist das Hinzufügen von '-exec echo' {} '"wurde gelöscht" \; 'zum' find'-Befehl, anstatt es in eine separate Zeile zu setzen. –
@phurareo, der Bash-Code weiß nicht *, ob eine einzelne Löschung erfolgreich war - das ist alles intern zu "finden". –