![](https://seccdn.libravatar.org/avatar/7186928c6d6698f06469798db38e6847.jpg?s=120&d=mm&r=g)
hallo liste, ich bastle gerade an einem script, dies soll kopien von daten ablegen. so eine art datensicherung. nun möchte ich dass der dateiname der sicherung mit dem datum versehen wird (entweder mache ich eine tar.gz oder ein verzeichnis) so genau weiss ich das noch nicht. dies ist auch kein problem. das eigentliche problem liegt darin, dass die "gesicherten" daten nach einer zeit nicht mehr gebraucht werden. also brauche ich ein script das mit die dateien (oder verzeichnisse) nach einiger zeit löscht. ich nicht weiss wie man mit dem datum rechnen kann (im shellscript). sowas wie date +%s (gibt die anzahl sekunden zurück) minus 432000 (5tage) dann wieder ein datum im format %Y%m%d machen, um die datei (oder verzeichnis) zu löschen. eventuell könnte ich auch auf das erstell datum der datei zurückgreifen. nur wie findet man die differenz von zwei verschiedenen daten raus? die suche über die liste und auch google hat mir nicht geholfen, ich weiss auch nicht nach was ich suchen sollte. ich denke auch dass dies für die meissten hier in der liste überhaupt kein problem darstellen könnte. danke für die hinweise -- gruss thomas
![](https://seccdn.libravatar.org/avatar/f813d046a5c2f6cc9a7b1ea1a116acb3.jpg?s=120&d=mm&r=g)
Am Donnerstag Juni 3 2004 23:40 schrieb Thomas Fankhauser:
hallo liste,
ich bastle gerade an einem script, dies soll kopien von daten ablegen. so eine art datensicherung. nun möchte ich dass der dateiname der sicherung mit dem datum versehen wird (entweder mache ich eine tar.gz oder ein verzeichnis) so genau weiss ich das noch nicht.
Hallo Ich habe leider keine Shell-Lösung, aber bei mir tut folgende Perl-Lösung ihre Dienste. Ich habe auf einem anderen Rechner noch eine erweiterte Version, aber dies sollte schonmal im Ansatz reichen. Gruß Udo <schnipp> #!/usr/bin/perl -w #use strict; # convert unix time to date + time my ($sec,$min,$hour,$mday,$mon,$year) = localtime(time); my $date = sprintf("%0.2d.%0.2d.%0.4d",$mday,$mon+1,$year+1900); # backup variables my $date_ymd = sprintf("%0.4d%0.2d%0.2d",$year+1900,$mon+1,$mday); my $backup_directory = "/opt/Backup/"; my $backup_dir ="$backup_directory$date_ymd"; # Hier stehen die Datenbanken my @db_names = qw(mysql); # Hier stehen alle Verzeichnisse, die gespeichert werden sollen my @dir_names = qw(/root /etc /srv/www); #my $tape = "/dev/st0"; # start print "\nserver2backup.pl Version 20021123 (w) U. Neist (http://neist.dnsalias.org)\n"; print "\nStarte Backup: "; system "/bin/date"; # if dir doesn't exists, create it! if ( opendir (DIR,$backup_dir) ) { print "\nLoesche alte Backup-Files:\n"; system "/bin/rm -vf $backup_dir/*"; print "done\n\n"; } else { mkdir $backup_dir; system "/bin/chown root.root $backup_dir" } closedir DIR; $old_dir = `/usr/bin/find $backup_directory -mtime 3 -type d`; if ($old_dir eq "") { print "Keine alten Backup-Verzeichnisse gefunden.\n\n" } else { chomp $old_dir; # delete old backups print "\nLoesche alte Backup-Verzeichnisse: "; system "/bin/rm -vf $old_dir/*"; rmdir $old_dir; print "fertig\n"; } # backup all files of selected directories foreach $dir_name (@dir_names){ $dir2backup = $dir_name; $dir2backup=~ s/(\/)/\_/g; # ersetzt den "/" durch "_" $backup_file = "$backup_dir/backup$dir2backup"; $backup_log = "$backup_dir/logfile$dir2backup"; print "Verzeichnis: $dir_name\n"; print "Datei: $backup_file.tar\n"; print "Logdatei: $backup_log.log\n"; system "/bin/tar cvplPS --totals -f $backup_file.tar $dir_name
$backup_log"; print "fertig\n\n"; }
# start to backup mysql-db print "Backup mysql-DB\n"; # dump all the DBs we want to backup foreach $db_name (@db_names){ my $dump_file = "$backup_dir/mysql_db.$db_name.dump"; print "Database to be backuped: $db_name... "; system "/usr/bin/mysqldump -c -e -l -q --flush-logs -uroot -pwerner $db_name > $dump_file"; print "fertig \n"; } # restart the update log to log to a new file! # system "/usr/bin/mysqladmin refresh"; </schnipp> -- Yes, it is written. Good shall always destroy evil. -- Sirah the Yang, "The Omega Glory", stardate unknown
![](https://seccdn.libravatar.org/avatar/55dd4380d175584568cdc046ba85159b.jpg?s=120&d=mm&r=g)
Am Donnerstag, 3. Juni 2004 23:40 schrieb Thomas Fankhauser:
eventuell könnte ich auch auf das erstell datum der datei zurückgreifen. nur wie findet man die differenz von zwei verschiedenen daten raus?
Das ist IMO ziemlich umständlich. Ich habe mal so was gemacht um ungefähr die Brenndauer angezeigt zu bekommen: STARTSEC=`date +%s` ENDSEC=`date +%s` echo "$ENDE ENDE CD-ERSTELLUNG ""$((($ENDSEC-$STARTSEC)/3600))"h "$(( ($ENDSEC-$STARTSEC-($ENDSEC-$STARTSEC)/3600*3600)/60 ))""m (""$(($ENDSEC-$STARTSEC))"" sec. total)" Al
![](https://seccdn.libravatar.org/avatar/7186928c6d6698f06469798db38e6847.jpg?s=120&d=mm&r=g)
hallo al und udo, Al Bogner wrote:
Am Donnerstag, 3. Juni 2004 23:40 schrieb Thomas Fankhauser:
eventuell könnte ich auch auf das erstell datum der datei zurückgreifen. nur wie findet man die differenz von zwei verschiedenen daten raus?
Das ist IMO ziemlich umständlich. Ich habe mal so was gemacht um ungefähr die Brenndauer angezeigt zu bekommen:
STARTSEC=`date +%s` ENDSEC=`date +%s`
echo "$ENDE ENDE CD-ERSTELLUNG ""$((($ENDSEC-$STARTSEC)/3600))"h "$(( ($ENDSEC-$STARTSEC-($ENDSEC-$STARTSEC)/3600*3600)/60 ))""m (""$(($ENDSEC-$STARTSEC))"" sec. total)"
Al
vielen dank für die anregungen. mit hilfe eurer anregungen habe ich nun bei google die für mich passende lösung gefunden. date -d '5 days ago' +%Y%m%d dies schein zu funktionieren. einen anderen lösungsansatz hat mich irritiert. der hat auch nur bedingt funktioniert, komischerweise geht er nicht richtig über die monatsenden hinaus. <---- funktioniert nicht ------> date -d $((`date +%Y%m%d`-5)) +%Y%m%d ergibt bei mir heute (4.6.2004 00:15) als ausgabe 20040807 jedoch : date -d $((`date +%Y%m%d`-4)) +%Y%m%d erscheint richtig! 20040531 warum macht er das? weil bei der zweiten version der tag = 0 ist somit der letzte tag des vormonats! negative tage kann es ja nicht geben. gäbe es einen weg um der shell mitzuteilen rm -R 'alles was älter als 5 tage ist' ? vielen dank für die hilfe, hat mich sehr gefreut wieder mal antworten auf meine frage zu erhalten. (das kommt in der letzten zeit etwas selten vor) vielleicht liegt dies ja auch an meiner fragenstellung, manchmal weiss ich aber nicht wie ich die frage formulieren soll. (wenn ich das wüsste, würde mir google sicher auch sofort auf die antworten hinweisen) -- gruss thomas
![](https://seccdn.libravatar.org/avatar/7b33cb1e776e35b87edb8ef09f0c888f.jpg?s=120&d=mm&r=g)
Hallo, Am Thu, 03 Jun 2004, Thomas Fankhauser schrieb:
das eigentliche problem liegt darin, dass die "gesicherten" daten nach einer zeit nicht mehr gebraucht werden. also brauche ich ein script das mit die dateien (oder verzeichnisse) nach einiger zeit löscht. ich nicht weiss wie man mit dem datum rechnen kann (im shellscript). sowas wie date +%s (gibt die anzahl sekunden zurück) minus 432000 (5tage) dann wieder ein datum im format %Y%m%d machen, um die datei (oder verzeichnis) zu löschen.
eventuell könnte ich auch auf das erstell datum der datei zurückgreifen. nur wie findet man die differenz von zwei verschiedenen daten raus?
Du denkst in die richtige Richtung: Mit date -r backupdatei '+%s' bekommst du das Datum von backupdatei in Sekunden, mit date '+%s' das aktuelle. Ist die Differenz aktuell - backup groesser als 5 Tage (in Sekunden) ist die backupdatei aelter als 5 Tage. Ergo: if test $[ `date '+%s'` - `date -r backupdatei '+%s'` ] -gt 432000 rm backupdatei fi Vermutlich suchst du aber sowieso nach find, z.B. find /pfad -ctime +5 -print0 | xargs -0 ls (statt ls kannst du dann ja rm verwenden). -dnh -- If you haven't got time to RTFM, you haven't got time to whine on this mailing list.
![](https://seccdn.libravatar.org/avatar/735ea797d876adb026ae955e8adbf597.jpg?s=120&d=mm&r=g)
Am Donnerstag, 3. Juni 2004 23:40 schrieb Thomas Fankhauser:
ich bastle gerade an einem script, dies soll kopien von daten ablegen. so eine art datensicherung. nun möchte ich dass der dateiname der sicherung mit dem datum versehen wird (entweder mache ich eine tar.gz oder ein verzeichnis) so genau weiss ich das noch nicht.
dies ist auch kein problem. das eigentliche problem liegt darin, dass die "gesicherten" daten nach einer zeit nicht mehr gebraucht werden. also brauche ich ein script das mit die dateien (oder verzeichnisse) nach einiger zeit löscht. ich nicht weiss wie man mit dem datum rechnen kann (im shellscript). sowas wie date +%s (gibt die anzahl sekunden zurück) minus 432000 (5tage) dann wieder ein datum im format %Y%m%d machen, um die datei (oder verzeichnis) zu löschen.
Warum so umständlich? find /backup_dir -ctime +7 -exec rm \-rf {} \; löscht Dir im Verzeichnis /backup alles, was vor mehr als 7 Tagen angelegt wurde. man find Jan
participants (5)
-
Al Bogner
-
David Haller
-
Jan.Trippler@t-online.de
-
Thomas Fankhauser
-
Udo Neist