• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[Gelöst] Löschen bestimmter Dateien

Ronin

Newbie
Hallo Zusammen,

Habe folgendes Problem:

Ich habe Logfiles, die in folgenden Formaten vorliegen:

access.log.42.gz <- Laufende Nummer gepackt für eine Woche.
access.log.43.gz

access.log.44.1 <-Ungepackt für einen Tag

access.log.44.1.gz <-Gepackt für einen Tag
access.log.44.2.gz

Nach access.log.44.7.gz bekomme ich dann das access.log.44.gz, in dem alle laufenden Nummern enthalten sind.

Nun möchte ich, sobald ich beispielsweise das access.log.44.gz habe, die entsprechenden access.log.44.1.gz, access.log.44.2.gz, usw. und die access.log.44.1, access.log.44.2, usw. löschen.

Leider weiß ich nur nicht genau, wie ich das anstellen soll.

Mittels
Code:
find -type f -name "access.log.??.?.*"
und
Code:
find -type f -name "access.log.??.?"
liste ich mir zwar die Dateien, die ich gerne löschen möchte, nur wie prüfe ich das, damit die auch erst gelöscht werden, wenn das gesamte gepackte Wochenpaket da ist?

Eine Idee wäre, die fehlende Zahl mit einem Array und den Zahlen 1-52 anzulegen und das Ganze in eine Schleife zu packen, aber da gibt es doch sicher einen eleganteren Weg?
 

abgdf

Guru
Look Ma', no "find":
Code:
#!/bin/bash

for(( i=1;i<=52;i++ ))
do
    if test -f "access.log.$i.gz"
    then
        for(( u=1;u<=7;u++ ))
        do
            f1="access.log.$i.$u"
            if test -f "$f1"
            then
                echo "Deleting $f1"
                # rm "$f1"
            fi
            f2="access.log.$i.$u.gz"
            if test -f "$f2"
            then
                echo "Deleting $f2"
                # rm "$f2"
            fi
        done
    fi
done
:mrgreen:
 
A

Anonymous

Gast
Ronin schrieb:
aber da gibt es doch sicher einen eleganteren Weg?
man muss nur die Tools verwenden die Linux dafür vorsieht und nicht das Rad immer neu erfinden wollen. http://www.linux-praxis.de/lpic1/manpages/logrotate.html

robi
 
OP
R

Ronin

Newbie
Suuuper. 1000Dank für Eure Hilfe.

War wohl ein wenig zu kompliziert gedacht, ein Array mit 52 Zahlen zu befüllen.
Schon peinlich, aber eine popelige for-Schleife ist mir gar nicht in den Sinn gekommen. :)

@robi: logrotate gut und schön, aber ohne mich jetzt weiter in die Möglichkeiten von logrotate einzulesen, funktioniert das meines Wissens nur mit Logfiles, die auf dem eigenen Rechner erstellt/angelegt werden.

Ich hab hier aber nen Backup-Server stehen, der diverse Websites bei meinen Providern spiegelt.
Die Logfiles bekomme ich in diesem Format zur Verfügung gestellt und will sie zwecks Auswertung tagesaktuell mit Analog weiterbearbeiten.
Hierzu muss ich sie umkopieren und halt mein Eingangs geschildertes Problem lösen, denn Analog meckert immer, wenn doppelte Einträge da sind und das wird mit der Zeit ziemlich nervig.
 

abgdf

Guru
Na, schon gelöst ... Aber weil's so schön war, trotzdem nochmal in Python:
Code:
#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

import os

pre = "access.log."

for i in range(1, 53, 1):
    if os.path.isfile(pre + str(i) + ".gz"):
        for u in range(1, 8, 1):
            f1 = pre + str(i) + "." + str(u)
            if os.path.isfile(f1):
                print "Deleting " + f1
                # os.remove(f1)
            f2 = f1 + ".gz"
            if os.path.isfile(f2):
                print "Deleting " + f2
                # os.remove(f2)
und in Perl:
Code:
#!/usr/bin/perl

use warnings;
use strict;

my $pre = "access.log.";

for my $i (1 .. 52) {
    if (-f "$pre$i.gz") {
        for my $u (1 .. 7) {
            my $f1 = "$pre$i.$u";
            if (-f $f1) {
                print "Deleting $f1\n";
                # unlink($f1);
            }
            my $f2 = "$f1.gz";
            if (-f $f2) {
                print "Deleting $f2\n";
                # unlink($f2);
            }
        }
    }
}
:mrgreen:

Übrigens geben in diesen Sprachen die range()-Funktion (Python), bzw. der range-Operator (Perl), mit denen man Schleifen erzeugen kann, tatsächlich Arrays mit den jeweiligen Zahlen zurück:
Code:
python -c 'print range(1, 10, 1)'
Code:
perl -e 'print 1 .. 10;'
Gruß
 
Oben