2017-09-19 5 views
1

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 
+2

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

+2

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

+0

@phurareo, der Bash-Code weiß nicht *, ob eine einzelne Löschung erfolgreich war - das ist alles intern zu "finden". –

Antwort

2

Sie die echo in die find verschmelzen können.

find "$filepath" -mtime +7 -type f -delete -exec echo '{}' "has been deleted." \; 

Die -delete Option ist nur ein Verknüpfung für -exec rm '{}' \; und alle -exec Befehle werden in der Reihenfolge ausgeführt, in der Sie sie angeben.

+1

'-exec sh -c 'printf "% s wurde gelöscht. \ N" "$ @"' _ {} + 'ist ein bisschen effizienter zu gestalten, die kleinstmögliche Zahl läuft von externen Prozessen (vs ein '/ bin/echo' pro Spiel). –

+0

Danke @MadP und @Charles! Das hat den Trick gemacht. –

Verwandte Themen