Re: /usr/ports/packag

From: Oliver Fromme <oliver(at)fromme.com>
Date: Wed, 20 Jun 2018 16:05:36 +0200 (CEST)

Harold Gutch wrote:
> On Wed, Jun 20, 2018 at 01:36:09PM +0200, Sascha Hüdepohl wrote:
> > [...]
> > Es funktioniert soweit alles prima. Nur sammeln sich in
> > /usr/ports/packages/All all die alten Versionen der Pakete, was dann
> > beim updaten des produktiv-Jails zu Warnungen führt. Ich finde einfach
> > keinen einfachen Weg das Verzeichnis von alten Versionen zu bereinigen.
> >
> > „Das muß doch ein Standardproblem sein“, dachte ich. Also bevor ich da
> > was skripte frag ich lieber mal.
>
> "rm *" (oder "mv * old" oder dergleichen) klingt für mich relativ
> einfach. Wenn du nur alte Pakete löschen/wegschieben willst kannst du
> das ja anhand der Zeitstempel machen.
>
> Was genau für "Warnungen" meinst du eigentlich? Geht es um ein "Paket
> X wurde für FreeBSD X gebaut, das hier ist aber ein FreeBSD Y"? Da
> hilft vielleicht
>
> pkg query -F/usr/ports/packages/All/foo-x.y.z.txz '%q'
>
> ... oder verstehe ich das eigentliche Problem gerade nicht?

Ich vermute, das Problem ist, dass es in dem Verzeichnis wie
folgt aussieht:

foobar-1.0.txz
foobar-1.1.txz
foobar-1.2.txz
hurz-grunz-4.3.19.txz
hurz-grunz-4.3.21.txz
laberfasel-2017.b3.txz
laberfasel-2018.a1.txz
laberfasel-2018.a2.txz

... und es sollen nun alle Versionen BIS AUF die jeweils neuste
gelöscht werden.

Da in einer Versionsnummer kein „-“ vorkommen kann (im Namen
der Software aber schon), könnte man ein kleines Skript
schreiben, das die Dateinamen an dem „-“ splittet, das sich
am weitesten rechts befindet. Anhand des linken Teils kann
man die Dateien dann gruppieren, und aus jeder Gruppe nur die
Datei mit der neusten mtime behalten. Aufpassen: foo-1.0.txz
und foo-18-1.1.txz sind zwei *verschiedene* Programme, nicht
zwei Versionen desselben Programms („18“ gehört hier nicht
zur Version, sondern zum Programmnamen).

Man könnte auch auf die Idee kommen, anhand der Versionsnummer
(d.h. rechter Teil) zu schauen, welches die neuste ist. Das
ist aber alles andere als trivial, da die Version eine ziemlich
beliebige Kombination aus Zahlen, Buchstaben und ein paar
anderen Zeichen sein kann, und ab und zu ändert sich bei einem
Programm auch mal das Versionsschema. Am einfachsten ist es
tatsächlich, sich an der mtime der Dateien zu orientieren.

Da ich das tatsächlich auch ab und zu mal brauche, habe ich
ein Skript dafür. Einfach den untenstehende Abschnitt zwischen
den beiden Trennzeilen z.B. in ~/bin speichern (bei mir heißt
es „package-expire“), mit chmod ausführbar machen und ggf. mit
„rehash“ den Such-Cache der Shell erneuern, damit es sofort
gefunden wird.

Das Skript selbst löscht nichts, sondern gibt nur die Dateien
aus, die im aktuellen Verzeichnis gelöscht werden können.
Wenn man mutig ist, kann man es direkt in rm reinfüttern,
ansonsten erstmal einen Blick draufwerfen. Alternativ kann
man die Dateien auch erstmal in ein „Papierkorb“-Verzeichnis
verschieben, das man dann später entsorgt.

Gruß
 ― Olli

------------------------ <schnippel> ------------------------
#!/usr/bin/env python2

from os import listdir, stat
from os.path import isfile

def base (name): return name.rsplit("-", 1)[0]
def mtime (name): return stat(name).st_mtime
def is_package (name): return isfile(name) and name.endswith(".txz")

filenames = filter(is_package, listdir("."))
groupnames = set(base(f) for f in filenames)

oldfiles = []
for g in groupnames:
        mtime_files = [(mtime(f), f) for f in filenames if base(f) == g]
        oldfiles += [mf[1] for mf in sorted(mtime_files)[0 : -1]]

print "\n".join(sorted(oldfiles))
------------------------ </schnippel> ------------------------

-- 
Oliver Fromme, München   --   FreeBSD + DragonFly BSD
``We are all but compressed light'' - Albert Einstein
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Wed 20 Jun 2018 - 16:05:41 CEST

search this site