Beibehaltung der neuesten 5 Files in einem Directory

framp

Moderator
Teammitglied
Moin,

Linux ist ja bekannt fuer sein Baukastensystem aus Kommandos. Ich habe das Problem, dass ich regelmaessig tar Backups in einem Verzeichnis erzeuge und immer nur die letzten 5 Backups aufheben moechte. Dazu habe ich mir ein shell Script geschrieben, welches per ls die Filenamen holt und dafuer sorgt, dass nur 5 Files im Directory stehen bleiben. Der Rest wird geloescht. Das funktioniert soweit gut.

Aber irgendwie muss das doch auch per Kommandpiping gehen.

Hat jemand eine Idee fuer einen Einzeiler? Mit awk oder perl geht das natuerlich aber mich interessiert ob jemand eine Loesung hat ohne 'for' und 'if'.
 

TeXpert

Guru
hmm, könnte mit ls -ct | tail <foo>| xargs rm gehen... aber das ist nur ein Schnellschuss musst mal manpages lesen. (aber auch nur wenn die ctime passend ist ;) )
 

useher

Member
Ich schreibe bei sowas immer eine Form des Datums in den Dateinamen mit date, danach lässt sich dann prima suchen.

Gruß Uwe
 

TeXpert

Guru
Uwe_S schrieb:
Ich schreibe bei sowas immer eine Form des Datums in den Dateinamen mit date, danach lässt sich dann prima suchen.

Gruß Uwe

und wie löschst Du dann ohne Schleife? oder if? *grins*

und das Datum steht ja auch in den metadaten...


ich hab noch mal drüber nachgedacht, ein

Code:
$ ls -ct1 | tail -n+6 | xargs rm
müsste wirklich funktionieren, sofern die ctime die Zeit ist die sein soll...
 
Also vor einen neuen Backup nenne ich die Dateien immer um.

Code:
ANZ=5
while [ $ANZ -gt 1 ]
do
     OLD=$ANZ
     let ANZ=ANZ-1
     if [ -r backup.$ANZ ]
    then
    mv backup.$ANZ backup.$OLD
   fi
done
mv backup backup.1
tar cf backup
Damit ist es egal welche Zeitstempel die Dateien haben.
Das if sorgt dafür dass die ersten 5 Backups keine Fehlermeldung vom mv kommt.
 

useher

Member
TeXpert schrieb:
und wie löschst Du dann ohne Schleife? oder if?

Wahrscheinlich liegts daran, das ich eine Wochennummer und eine Tagnummer in den Namen reinschreibe. Dann kann ich über (date -d '1 week ago' "+%V)" alles löschen wo diese Wochennummer an einer bestimmten Stelle im Namen vorkommt. Macht gleich das Backupscript, bevor es neue Backups schreibt. So entstehen bei mir eigentlich garnicht erst überflüssige Files.

Gruß Uwe
 

framp

Moderator
Teammitglied
TeXpert schrieb:
Code:
$ ls -ct1 | tail -n+6 | xargs rm
müsste wirklich funktionieren, sofern die ctime die Zeit ist die sein soll...

Bingo ! Funktioniert gut :D . Toller Trick mit tail -n+6. Allerdings darf kein long listing ausgegeben werden. Also
Code:
ls -ct | tail -n+6 | xargs rm
Nur gibt es ein Problem wenn weniger als 6 Files im Directory stehen. Dann gibt es
Code:
rm: missing operand
D.h. in der initial backup phase gibt es Fehler. Die koennen auch im shell script mit ifs abgefragt werden.

Aber wenn man sie mit
Code:
ls -ct | tail -n+6 | xargs rm 1>/dev/null 2>&1
unterdrueckt ist auch das Problem geloest.

Es ist immer wieder erstaunlich wie schoen man die einzelnen doch recht einfachen Linux Bausteine zu maechtigen Befehlen zusammenstoepseln kann.
 

TeXpert

Guru
framp schrieb:
TeXpert schrieb:
Code:
$ ls -ct1 | tail -n+6 | xargs rm
müsste wirklich funktionieren, sofern die ctime die Zeit ist die sein soll...

Bingo ! Funktioniert gut :D . Toller Trick mit tail -n+6. Allerdings darf kein long listing ausgegeben werden. Also

wer hat was von "l" gesagt, ich nutzte "1" ... kauf Dir eine Brille oder einen anderen Font ;) aber das kann auch wegfallen...
Nur gibt es ein Problem wenn weniger als 6 Files im Directory stehen. Dann gibt es
Code:
rm: missing operand

hab isch nisch jesacht, Du sollst die manpages der Tools lesen... *blätter* jepp hab isch...
ich schrieb:
musst mal manpages lesen

dann wäre Dir unzweifelhaft bei man xargs die -r Option aufgefallen...

Code:
    --no-run-if-empty, -r
              If the standard input does not contain any nonblanks, do not run the command.  Normally, the command is run once even if there is no input.

dass man bei einem rm in einem Script natürlich trotzdem mit Abfragen und Sicherheitsnetz arbeitet ist ja wohl klar...
 

framp

Moderator
Teammitglied
TeXpert schrieb:
wer hat was von "l" gesagt, ich nutzte "1" ... kauf Dir eine Brille oder einen anderen Font ;) aber das kann auch wegfallen...
Die habe ich schon auf :roll:. Bei meinem Font sehen die beiden wirklich fast gleich aus :evil: .Welchen Font benutzt Du?
dann wäre Dir unzweifelhaft bei man xargs die -r Option aufgefallen...
1>&2 2>/dev/null ist mein bekannter Standardweg Meldungen zu unterdruecken. Deshalb habe ich erst gar nicht bei man xarg nachgesehen :oops: .
 

framp

Moderator
Teammitglied
@haveaniceday

Du machst also die Versionkontrolle ueber die Extension und push und pop. Auch keine schlechte Idee.
Aber die TeXpert Variante ist eben die linuxische Art :) ... oder heisst das linuxianische Art :lol: ?
 
Ich habe schon zu oft hinterher in Verzeichnissen weitere Dateien gesehen.
Bei "ls -..." ohne den Backupnamen+ wildcard anzugeben schon mal
alles an backup verschwinden.
Da ist es mir lieber ich arbeite nur mit Namen..
Und dann boote der Rechner mit kaputter Hardwareuhr..

Haveaniceday
 
Oben