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

Auflisten von Files und Löschen von ältestem

Napsty

Newbie
Servus

Habe versucht, nach einer Lösung zu finden, aber keine Ahnung, wie man diese Funktion bzw. Suchweise überhaupt beschreiben soll.

Also ich führe den folgenden Befehl aus:

Code:
find . -type d -name "*sgtace01*"

Die Ausgabe zeigt darauf folgendes an:
./20070207-sgtace01.sg01
./20070226-sgtace01.sg01

Nun würd ich gerne dem find-Befehl noch ein -exec dranhängen, das den älteren Ordner löscht...

Dieses Script soll jede Woche automatisch starten und der Suchbegriff wird mittels Variable übergeben.

Vorschläge, dies anders zu lösen, sind natürlich auch willkommen :)

mfg
Napsty[/code]
 

sparrow

Member
Du könntest, mit Hilfe der Optionen -mtime bzw. -atime, nur Dateien/Ordner finden lassen deren letztes Änderungsdatum schon eine gewisse Zeit her ist.
Würde das zum eingrenzen reichen?

Gruß
Sparrow
 
OP
N

Napsty

Newbie
ja, daran habe ich auch gedacht. Das Problem ist aber, dass diese Ordner in unregelmässigen Abständen erstellt werden. Also es kann sein, dass diese 1 Monat dazwischen liegen oder nur eine Woche..

Aber ich glaube, ich werde es dennoch so machen. Werde einfach ein Script erstellen, das auf Variablen wartet z.b.

./delolddir.sh sgtace01 +13

Wobei sgtace01 für den Namen im "find"-Befehl steht und +13 für den Wert bei atime bzw. mtime.
 

abgdf

Guru
Hi,

vielleicht ist -newer von "find" eine Option.

Ansonsten hat z.B. das time-Modul von Python umfangreiche Möglichkeiten, mit Zeit umzugehen (dazu "pydoc time").
Hier mal ein entsprechendes Skript. Bitte speichere es als "t.py" ab und mache "chmod +x t.py".
Dann leite Deinen Output von "find" in eine Datei namens "dat", also "find .... > dat".
Kopiere "t.py" dann in das Verzeichnis, in dem auch "dat" liegt und mache "./t.py".
Dann müßte jedes bis auf das neueste Deiner Verzeichnisse ausgegeben werden:

Code:
#!/usr/bin/env python

import os
import time

f = open("dat", "r")
a = f.readlines()
f.close()

b = []
s = 0.0
s2 = ""

for i in a:
    b.append(i.rstrip('\n'))
    c = i.split("-")[0]
    c = c[2:] # Kill "./" at beginning of filename
    timetupel = (int(c[0:4]), int(c[4:6]), int(c[6:8]), 0, 0, 0, 0, 0, 0)
    t = time.mktime(timetupel)

    if t > s:
        s = t
        s2 = i.rstrip('\n')

if s2 != "":
    b.remove(s2)

for i in b:
    print i

Damit könntest Du dann sowas wie "t.py > dat2" und "cat dat2 | rm -r" machen.

Viele Grüße
 

abgdf

Guru
... und hier doch auch noch ein Ansatz in bash (auch hier lese ich wie oben eine Datei "dat" aus):

Code:
#!/bin/bash

# Example: date --date='1970-01-01 00:02:00 +0000' +%s

appendix=' 00:00:00 +0000'
newest=0
neweststr=""

for i in $(cat dat); do
a=$(echo $i | awk -F "-" '{print $1}')
a=$(echo $a | awk -F "/" '{print $2}')

year=$(echo $a | awk '{ print substr($1,1,4)}')
month=$(echo $a | awk '{ print substr($1,5,2)}')
day=$(echo $a | awk '{ print substr($1,7,2)}')

datestr=$year$month$day$appendix

value=$(date --date="$datestr" +%s)

if [ $value -gt $newest ]; then
newest=$value
neweststr=$i
fi

done

echo "The newest directory is: $neweststr"

Viele Grüße
 
OP
N

Napsty

Newbie
Hey abgdf

Danke für das Script. Das Python Script macht genau die Abfrage, die ich brauche (die Bash-Abfrage macht das Gegenteil aber au net schlecht ^^)

Nun noch ein Problem:
Wenn ich die entsprechenden Files aus der Datei dat2 nun löschen will, passiert gar nichts.
Also ich mache "cat dat2 | rm -r -f" und es passiert nix...
 

abgdf

Guru
Ähh ja, Entschuldigung :oops:, es muß natürlich
Code:
rm -r $(cat dat2)
heißen.

bash ist manchmal tückisch ...

Wenn ich noch das Array-Problem

http://www.linux-club.de/viewtopic.php?t=77554

gelöst kriege, könnte ich vielleicht alles in einem bash-Skript zusammenfassen ...

Viele Grüße
 

abgdf

Guru
Hallo,

so, jetzt sollte ich (mit der Hilfe von b3ll3roph0n in dem anderen Thread oben) alles zusammenhaben. Probier mal, das folgende Skript in dem Verzeichnis über den zu untersuchenden Verzeichnissen laufen zu lassen (am Skript-Anfang ist ja Dein find-Befehl). Das Skript erzeugt dort dann selbst eine Datei "dat" :

Code:
#!/bin/bash

find . -type d -name "*sgtace01*" > dat

appendix=' 00:00:00 +0000'
newest=0
neweststr=""
newestnr=-1

declare -a a
i=0

while read f; do
  a[$i]=$f;
  let "i += 1";
done < dat;


for i in $(seq 0 $((${#a[@]} - 1)))
do
    b=${a[$i]}
    year=${b:2:4}
    month=${b:6:2}
    day=${b:8:2}

    datestr="$year-$month-$day$appendix"

    value=$(date --date="$datestr" +%s)

    if [ $value -gt $newest ]; then
        newest=$value
        neweststr=$b
        newestnr=$i
    fi
done

if [ $newestnr -gt -1 ]
then
    unset a[$i]
else
    echo
    echo "No suitable directories found at all. Aborting."
    echo
    exit 1
fi

echo
echo "The newest directory found is:"
echo $neweststr
echo

if [ ${#a[@]} -eq 0 ]
then
    echo "Just one directory found. So there is nothing to delete. Bye."
    echo
    exit 0
fi
    
echo "Older directories found are:"
for i in ${a[@]}
do
    echo $i
done

echo
echo "Do you want to delete these older directories (y/n) ?"
read del
if [ $del = "y" ]
then 
    rm -r ${a[@]} && echo "Ok, directories deleted."
else
    echo "Directories left unchanged. Bye."
fi

Viele Grüße
 
OP
N

Napsty

Newbie
WOW !! Super!! Vielen Dank, das ist echt ein super Script. Können bestimmt auch andere ab und zu verwenden.

Ich habe noch folgende Änderungen im Kopf gemacht:
Code:
#!/bin/bash
MACHINE=$1
find . -type d -name "*$MACHINE*" > dat

appendix=' 00:00:00 +0000'

Habe einfach den find-Befehl noch variabel gemacht, damit das Script z.B. per Cron automatisch gestartet werden und mehrere Backupordner löschen kann.
 
Oben