[linux-l] `dpkg -l` und das abschneiden einer Spalte...

Jens Dreger jens.dreger at physik.fu-berlin.de
Fr Mär 5 20:00:10 CET 2004


On Fri, Mar 05, 2004 at 07:26:51PM +0100, Oliver Beck wrote:
> Hallo BeLUG'ler,
> 
> ich stehe mal wieder vor einem Problem, das ich nicht selbst l?sen kann.
> 
> Folgendes will ich erreichen:
> 
> Mittels `dpkg` alle installierten Pakete ausgeben lassen.
> Diese daraufhin ?berpr?fen, ob sie Dateien in '/opt' installiert haben.
> Wenn dem so ist, den Paketnamen in eine tempor?re Datei speichern.
> 
> Klingt alles recht einfach...
> 
> Nun beschreibe ich mal, wie ich das versucht habe.
> 
> Ich habe ein Script geschrieben, das folgenderma?en aussieht:
> 
> ---snip---
> 
> OPTPKG=`dpkg -L $PKG | grep "\/opt\/"`
> 
> for PKG in `dpkg -l | grep "ii" | awk '{print $2}'`; do
> 
> 	if [ ${OPTPKG} == "0" ]; then
> 		echo $PKG >> /tmp/foo
> 	fi
> 
> done
> 
> ---snap---

Abgesehen davon, dass man das durch ein einfaches "dpkg -S /opt"
loesen kann und Dein Script auch deshalb nicht funktionieren wird,
weil die rechte Seite der OPTARG-Zuweisung sofort ausgewertet wird und
$PKG da noch gar nicht gesetzt ist, hast Du mit:

> Es wird die 2. Spalte (die
> den Namen des Paketes enth?lt), wenn ich die Ausgabe auf etwas anderen
> umleite, nach 14 Zeichen abgeschnitten. Pakete, die also einen l?ngeren
> Namen haben, als die besagten 14 Zeichen, werden von dem Aufruf in der
> if-Schleife nicht erkannt.

vollkommen Recht. dpkg versucht hier besonders smart zu sein und
berechnet die Spaltenbreite mit Hilfe der COLUMNS Environment
Variable. Superschlau, hab mich da schon oefter drueber aufgeregt. Das
Problem tritt naemlich auch schon ohne Output-Redirection auf, wenn
nur die Paketnamen lang genug sind:

dreger at smart:~> dpkg -l kernel-source-2.4.23\* 
[...]
un  kernel-source-2.4.23-nfsa <none>                    (no description available)
un  kernel-source-2.4.23-nfsa <none>                    (no description available)
un  kernel-source-2.4.23-nfsa <none>                    (no description available)

Daher habe ich irgendwann ein kleines 'dpkgl' gebastelt, welches
das fixt:

dreger at smart:~> dpkgl kernel-source-2.4.23\* 
un  kernel-source-2.4.23-nfsacl-libata-drbd-smp              <none>
un  kernel-source-2.4.23-nfsacl-libata-drbd-up               <none>
un  kernel-source-2.4.23-nfsacl-libata-up                    <none>

dreger at smart:/0> cat `which dpkgl`
#!/bin/sh
COLUMNS=$[2*$(stty size | cut -d' ' -f2)] dpkg -l "$@" | sed 's/^\([^ ]\+ \+[^ ]\+ \+[^ ]\+\).*/\1/'

Du kannst die Breite der Spalte zwar nicht festlegen, aber wenn Du
COLUMNS ausreichend gross waehlst, passt alles rauf...

Gruss,

Jens.




Mehr Informationen über die Mailingliste linux-l