Linux Notizen / Dateien Suchen
 
StartSeite | LinuxNotizen/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Als Einsteiger hat man sowieso ein Orientierungsproblem, das einem der Verzeichnisbaum fremd ist. Zusätzlich ist in vielen Beschreibungen von Programmen oder Konfigurationsdateien die Rede. Ständig ist man also auf der Suche nach irgendwelchen Systemkomponenten. Aber wie finden?

Dateien suchen mit KDE

Die einfachste Möglichkeit ist die Funktion "Dateien suchen" im Startmenü, die im wesentlichen der entsprechenden Funktion unter Windows nachempfunden ist.

Nachteil: sie war lähmend langsam (OffeneFrage: Warum?): 290 Sekunden für eine Komplettsuche nach "*.ttf" auf einer relativ frischen Installation auf /VerwendeteGeräte#PC1.

Das ist wahrscheinlich darauf zurückzuführen, daß KDE find benutzt um die gesamte Festplatte abzusuchen. Wie unten diskutiert, braucht das seine Zeit.

Dateien suchen mit dem Programm locate

Über die Eingabe von

locate Muster

werden aus einem täglich regenerierten Cache alle passenden Dateien gelisted. Dabei werden nur allgemein zugängliche Dateien indiziert.

Eine allfällige manuelle Reindizierung (z.B. nach größeren Installationen) kann durch updatedb ausgelöst werden.

Dateien suchen mit dem FHS

Der FHS (File Hierarchy Standard) legt fest welche Dateien wo zu liegen haben. Nach diesen Richtlinien lassen sich die meisten Systemfiles finden.

Dateien suchen mit dem Programm find

Um Dateien zu suchen steht das Programm "find" zur Verfügung.

Die Parameter von find zerfallen in folgende Gruppen:

Einfache Suche mit dem Namen als Suchkriterium

Um im ganzen Verzeichnisbaum Dateien zu finden und auszugeben, deren Dateiname zum Suchmuster "*.ttf" passt, kann man folgendes verwenden:

   find / -name "*.ttf" -print
Wenn beim Aufruf aus einer Shell als Suchbedingung ein Muster in Verbindung mit -name verwendet wird, dann muss die automatische Erweiterung des Musters durch die Shell verhindert werden. Andernfalls wird der zu einer Liste passender Dateinamen erweiterte Ausdruck an find übergeben, was nur sehr selten das ist, was der Benutzer erreichen will. Die einfachste Möglichkeit die Erweiterung des Musters zu unterbinden ist, diesen in Anführungszeichen zu setzen.

nützliche Parameter

Wenn man größere Dateisysteme gemountet hat (z.B. einen Netzwerkserver), dann ist

   find / 
meist nicht mehr sinnvoll. Die Option -mount, z. B.
   find / -mount
bewirkt, dass gemountete Dateisysteme nicht durchsucht werden.


Mit der Option -type t kann die Suche auf bestimmte Dateiarten beschränkt werden:

   find / -type d       (liefert nur Directories)
   find / -type f       (liefert nur File)
   find / -type l       (liefert nur Links)


Mit den Optionen -mindepth n und -maxdepth n kann die Suche in der Tiefe eingeschränkt werden:

Der gesamte Verzeichnisbaum unter dem aktuellen Verzeichnis:

   find . -type d                   
Nur die Unterverzeichnisse des aktuellen Verzeichnis:
   find . -type d -maxdepth 1       
Die HTML-Files genau eine Ebene unter dem aktuellen Verzeichnis:
   find . -type f -mindepth 2 -maxdepth -2 "*.html"      

Ausblenden von unerwünschten Fehlerausgaben

Gerade beim Durchsuchen des gesamten Verzeichnisbaumes ist es lästig, dass man als Benutzer auf viele Verzeichnisse stößt wo man keine Leserechte besitzt und die Suchergebnisse von entsprechenden Mitteilungen ("No Permission" oder "Keine Berechtigung") durchsetzt sind. Häufig soll verhindert werden, daß die Ausgabe durch eingestreute Fehlermeldungen unlesbar wird. Eine Möglichkeit dazu ist, die Fehlermitteilungen an einen Ort schicken, wo sie nicht stören. Mit einer zur Bourne Shell verträglichen Shell (bash, sh, ksh, ash, ...) also:

find / -name "*.ttf" -print 2>/dev/null

Mit einer zur C Shell kompatiblen Shell (csh, tcsh, ...) stellt sich das beliebte Problem, Standardausgabe und Fehlerausgabe zu trennen. Am leichtesten geht das mit einer Zwischendatei:

(find / -name "*.ttf" -print >ttf.found) >&/dev/null
cat ttf.found

DateiumleitungUnterUnix? ist aber eigentlich ein eigenes Thema

Fortgeschrittenenkommentare

Bei manchen find-Versionen (z. B. FreeBSD) ist der praktische Parameter -iname (case-insensitive Suche) nicht vorhanden.

Das ist weniger ein Problem von find sondern ein Problem des Umgangs mit regulären Ausdrücken. Eine Suche ohne Beachtung der Groß- oder Kleinschreibung ist über reguläre Ausdrücke auch auf Systemen möglich, die diese Logik nicht noch einmal in find abbilden. Nachdem der Parameter hinter -name ein regulärer Ausdruck ist, ist -iname eine (vielleicht bequeme aber nicht erforderliche) Luxusbeigabe. -- KurtWatzka

NACK. -name nimmt ein Glob-Pattern, keinen regulären Ausdruck. Dafür gibt es bei der GNU Version den eigenen -regex Test.


Es gibt aber noch weitere Unterschiede, z. B. in der Ausgabe. Während unter der GNU Version von find die Ausgabe je Datei frei gestaltet werden kann:

# gibt Größe und kompletten Pfad aus
find / -name "*.ttf" -printf "%s %p\n"

besitzt die FreeBSD Version von find nur die Aktionen "-print", "-print0" und "-ls", die gewisse Ausgabeformate zur Verfügung stellen.

Allerdings wird niemand daran gehindert die GNU-Version zu installieren. --ds

Expertenkommentare


Quellen

Gedanken

Eigentlich wäre das doch ein guter Ansatzpunkt, um in die Linux-Entwicklung einzusteigen. Das KDE-find muss irgendeinen fundamentalen Fehler machen, um so viel Zeit zu verschwenden. Der Source des effizienten GNU-find ist ebenso verfügbar. Sich das anzusehen und zu versuchen das KDE-find zu verbessern, müsste eine lösbare minimale Aufgabe sein, bei der man die grundsätzlichen Abläufe kennenlernen kann. Kommentare? --hl

Ist KDE-find wirklich soviel langsamer? Kann ich hier momentan nicht testen. Die Frage stellt sich vorallem wegen Cache-Interferenzen.


KategorieLinux
StartSeite | LinuxNotizen/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert am 21. Dezember 2002 7:56 (diff))
Suchbegriff: gesucht wird im Titel im Text