[linux-l] Ubuntu: Synaptic-Terminalausgabe Fehler "CRITICAL"

Volker Grabsch vog at notjusthosting.com
Mi Jan 17 12:27:58 CET 2007


On Tue, Jan 16, 2007 at 11:48:23AM +0100, Norman Steinbach wrote:
> Jan-Benedict Glaw wrote:
> > Programme können unter /usr/share/applications ablegen, wie sie
> > heißen, was sie können und für welche MIME-Typen sie zuständig sind.
> > Laut Google wird diese Fehlermeldung kommen, wenn in einer solchen
> > Datei zwei Einträge untereinander sind.  Vielleicht gibt das schon
> > 'nen Tip:
> > grep 'Desktop Entry' /usr/share/applications | cut -f 1 -d ':' | \
> > 	sort | uniq -c | grep -v '[[:space:]]*1'
> Ähm - davon abgesehen, dass ich keine Ahnung habe, was genau dieser
> Kommandozeilenbefehl tut

Der ist auch ziemlich umständlich. Und zudem falsch. Naja, über komplexe
Shell-Operationen, die man hier rein schreibt, ohne sie selbst
auszuprobieren, habe ich mich ja bereits ausgelassen.

Was Jan-Benedict vermutlich machen wollte:
Im Verzeichnis /usr/share/applications gibt es für jede Applikation eine
Datei, die unter anderem Desktop-Einträge hat. Nach diesen Einträgen
sucht er zunächst:

    grep 'Desktop Entry' /usr/share/applications/*

(hier ist schon der erste Fehler, das "/*" am Ende wurde vergessen)

Dabei tauchen die Dateien doppelt auf, in denen zwei solche "Desktop Entry"-
Bereiche stehen. Diese will er für dich herausfiltern.

Grep liefert die Dateien und die gefundenen Zeilen zurück. Wir brauchen
nur die Dateinamen, und schauen dann nach Doppelten. Das Herausschneiden
das Dateinamens soll "cut" übernehmen, aber das ist viel zu umständlich.
Grep hat bereits eine extra Option dafür:

    grep -l 'Desktop Entry' /usr/share/applications/*

Nun suchen wir nach Doppelten. Hierzu wollte er die Ausgabe sortieren.
Allerdings vergaß er, dass das vollkommen überflüssig ist, da grep
bereits die Dateinamen durch "...applications/*" von der Shell sortiert
erhält.

Er kann also direkt nach Doppelten suchen. Das geschieht mit dem
Kommando "uniq". Die Option "-c" sorgt dafür, dass uniq zu jeder Zeile
angibt, wie oft sie auftauchte:

    grep -l 'Desktop Entry' /usr/share/applications/* | uniq -c

Nun kommen sehr viele Zeilen von der Sorte:

 ....
      1 /usr/share/applications/ooo-math.desktop
      1 /usr/share/applications/ooo-writer.desktop
 ....

Alle, die nur einmal auftauchen, interessieren uns nicht, also noch
ein Grep-Befehl, der nach dieser 1 am Anfang sucht. Auch dort war ein
Fehler drin, da der Anker ^ vergessen wurde, und somit auch all
diejenigen Zeilen gefunden würden, bei denen im Dateinamen eine 1
auftaucht, oder die 10-19 mal auftauchen :-). Außerdem kann man sich
das [[:space:]] sparen, da wir wissen, dass wir es mit Leerzeichen
zu tun haben. Wir verwenden die Option -v, um das Grep-Ergebnis zu
invertieren. Schließlich suchen wir alle Zeilen, die *nicht* mit
vielen Leerzeichen und einer 1 beginnen:

    grep -l 'Desktop Entry' /usr/share/applications/* | uniq -c | grep -v "^      1 "

Dieser Befehl ist schon viel kürzer, aber immer noch ziemlich lang.
Übersichtlicher wird es, wenn wir schonmal ins richtige Verzeichnis
gehen:

    cd /usr/share/applications
    grep -l 'Desktop Entry' * | uniq -c | grep -v "^      1 "

So, das war es, was Jan-Benedict vermutlich wollte. Probier das mal
aus, Norman.


Und dieses Kommando ist nun auch leicht zu erklären. Es ist eine
Pipeline von 3 Befehlen:

1. Suche nach allen Dateien mit "Desktop Entry"
2. Schaue, wie oft diese Zeile in den Dateien auftaucht
3. Filtere die heraus, bei denen der Eintrag nur 1x auftaucht.

Übrig bleiben die Dateien mit den (unerwünschten) doppelten Einträgen.


Viele Grüße,

    Volker

-- 
Volker Grabsch
---<<(())>>---
Administrator
NotJustHosting GbR



Mehr Informationen über die Mailingliste linux-l