Betriebssysteme I 7 Dateisuche WS 2016/17 Prof. Dr. Dirk Müller Überblick ● Motivation ● ls ● find ● whereis ● Zusammenfassung Dirk Müller: Betriebssysteme I WS 2016/17 2/13 Motivation ● riesige Datenmengen – Ziel: Übersicht behalten ● riesige Anzahl von Dateien auf Festplatten, SSDs, CDs, DVDs, USB-Sticks – selber Dateiname in verschiedenen Verzeichnissen main.c, ● Moderne Distributionen haben Konzept der Standardverzeichnisse für Dateien in Linux bzw. UNIX aufgeweicht. – /bin vs. /usr/bin vs. /usr/local/bin; /opt ● Sind Dokumentation und Quellcode zu meiner Anwendung sauber mit installiert und wo? – ggf. Nachinstallation oder Entfernung Dirk Müller: Betriebssysteme I WS 2016/17 3/13 ls ● ● ls [OPTION]... [DATEI]... Standardverhalten – – – – – – ● Suche mittels Dateinamenfilter (Jokerzeichen ? und * sowie Aufzählung, Bereich, Menge, Ausschluss) alphabetische Sortierung zeigt Inhalt von Verzeichnissen (Standard: aktuelles) an listet Dateien auf Formatierung am Terminal: mehrere Spalten versteckte Dateien (Name beginnend mit .) nicht gelistet nicht rekursiv Optionen -l lange Form der Ausgabe -1 nur 1 Datei pro Zeile Auswertung mit Befehl grep in Pipe -i zeigt I-Node-Nummern möglich, aber Probleme bei -U unsortiert Spezialzeichen in Dateinamen -S absteigend sortiert nach Dateigröße -t nach Änderungszeit -a alle Dateien Sortierung als indirekte Art der (unscharfen) Suche -R rekursiv Dirk Müller: Betriebssysteme I WS 2016/17 4/13 find ● ● ● Suchen von Dateien, die bestimmten Bedingungen genügen, und Ausführen von Kommandos auf den gefundenen Dateien zu symbolischen Links Optimierungslevel 0 bis 3 Anzeige von Diagnose-Daten find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [Startverzeichnis...] [Suchkriteriumsaudruck] alle Bäume mit angegebenen Startverzeichnissen als Wurzeln rekursiv durchsuchen – Standardwert: . für aktuelles Verzeichnis ● Suchkriterium als Ausdruck (expression), kann aus Bedingungen (mittels Operatoren, Optionen, Vergleichen) und Aktionen bestehen – Standardbedingung ist leer, also keine Einschränkung – Standardaktion ist -print für Ausgabe der aktuell gefundenen Datei auf stdout Dirk Müller: Betriebssysteme I WS 2016/17 5/13 Pures find ● ● Was macht ein find ohne Optionen und Parameter? Standardverzeichnis: durchsucht Baum ausgehend vom aktuellen Verzeichnis ● Standardausdruck: listet alle gefundenen Dateien auf ● entspricht in etwa einem ls -1RU – einspaltige Auflistung – rekursives Suchen in Unterverzeichnissen – unsortiert, Anordnung wie Verzeichniseinträge gefunden werden, keine alphabetische Sortierung ● Simulation eines ls in etwa mittels find -mindepth 1 -maxdepth 1 -printf '%f\t' für minimale und maximale Abstiegstiefe vom Startpunkt . auf 1 (und somit genau 1) gesetzt Dirk Müller: Betriebssysteme I WS 2016/17 6/13 find -name <Muster> ● ● Suche nach Dateien mit dem Namensmuster <Muster> in einfachen Anführungszeichen (oder alle Jokerzeichen entwertet), um Expansion durch die Shell zu verhindern $ find -name a* find: Der Pfad muss vor dem Ausdruck stehen: a.1 ● nur Dateiname, keine Pfadangaben (weder absolute noch relative), also kein Schrägstrich im Suchmuster $ find -name 'a/hallo.data' find: Warnung: Unix-Dateinamen enthalten gewöhnlich keine Schrägstriche (anders als Pfadbezeichnungen). Deshalb wird »name ‘a/hallo.data’« wahrscheinlich immer »Falsch« auf diesem System ergeben. Möglicherweise sind »-wholename« oder »-samefile« bessere Tests. Alternativ kann auch GNU grep verwendet werden: »find ... -print0 | grep -FzZ ‘a/hallo.data’«. Dirk Müller: Betriebssysteme I WS 2016/17 7/13 find -type und find -xtype ● ● ● find -type <Typ> sucht nach Dateien vom Typ <Typ> f normale, reguläre Datei d Verzeichnis l symbolischer Link c zeichenorientiertes Gerät b blockorientiertes Gerät p benannte Pipe s Socket <Typ> bezieht sich auf Ziel eines symbolischen Links; falls -L oder -follow als Option gesetzt, liefert es immer false Ausweg: -xtype l, um genau die symbolischen Links auch mit einer Option -L oder -follow herauszufiltern Dirk Müller: Betriebssysteme I WS 2016/17 8/13 Weitere Bedingungen bei find ● ● -links <n> findet Dateien, auf die genau n harte Links zeigen -perm [-]<Oktalzahl> – ohne Minus: alle Dateien, die genau die Zugriffsrechtebits codiert als Oktalzahl gesetzt haben – mit Minus: alle Dateien, die mindestens die Zugriffsrechtebits codiert als Oktalzahl gesetzt haben ganzzahliger Anteil ● -atime [+|-]<n> letzter Lesezugriff ● -mtime [+|-]<n> letzter Schreibzugriff ● -ctime [+|-]<n> letzte Attributänderung ● -size [+|-]<n>[c] Größe n Blöcke bzw. Bytes bei c ● -user <Name> Eigentümer der Datei heißt <Name> vor n*24 h + mehr als - weniger als Dirk Müller: Betriebssysteme I WS 2016/17 9/13 Aktionen mit find ● ● -print Ausgabe des Dateinamens bei jeder gefundenen Datei, implizit als Standardaktion angenommen -exec <Kommando> ; – Anwendung von <Kommando> auf jede gefundene Datei – als Platzhalter (Metazeichen) für den jeweiligen Dateinamen wird {} verwendet – Platzhalter {} und Endezeichen ; sollten per \ oder durch Setzen in einfache Anführungszeichen entwertet werden, um eine Expansion durch die Shell zu verhindern – unsicher (per Spezifikation durch POSIX), da Time-of-check Timeof-use (TOCTOU) Race Condition bei Suche und Aufruf; Angriff: Umleitung durch Setzen eines Symlinks; stattdessen sollte -execdir verwendet werden – mit Pluszeichen am Ende schneller: -exec <Kommando> \+ ● Beispiel find -name 'my*' -exec ls -l '{}' \; und gibt esI im Langformat aus – findet alles mit dem DirkPräfix Müller:'my' Betriebssysteme WS 2016/17 10/13 Beispiele für find ● find $HOME -mtime 0 findet alle Dateien im Baum ab Home-Verzeichnis als Wurzel, die innerhalb der letzten 24 h geändert wurden ● find -perm 664 findet alle Dateien mit genau den Rechten rw-rw-r-- ● find -perm -664 findet alle Dateien mit den Mindestrechten rw-rw-r--, also beliebigen Ausführbarkeitsrechten und beliebigem Schreibrecht bei Nicht-Gruppenmitgliedern ● find -name 'my*' -execdir ls -l '{}' \+ schnelle und sichere Variante des Beispiels der letzten Folie ähnliches Verhalten wie bei ls -l `find -name 'my*'` Dirk Müller: Betriebssysteme I WS 2016/17 11/13 whereis ● Lokalisieren von Binärdateien, Handbuchseiten und Quelldateien zu einem Kommando – Funktionalität einer Paketverwaltung ● ● whereis [Optionen] <Datei> -b, -m, -s nur nach Binärdateien, Handbuchseiten, Quelldateien suchen ● -l Ausgabe der effektiven Suchpfade ● -u Suche nur nach ungewöhnlichen Einträgen ● Beispiel whereis -m -u /bin/* sucht nach Kommandos in /bin, die keine oder mehrere Handbuchseiten haben Dirk Müller: Betriebssysteme I WS 2016/17 12/13 Zusammenfassung ● einfache Suche mittels ls und Dateinamenfiltern, Sortierung oder anschließendem grep – Probleme bei Sonderzeichen in Dateinamen (auch schon bei Leerzeichen) – nicht rekursiv als Standard ● find als mächtiges Werkzeug zur Suche nach Dateien – – – – – ● Dateinamenfilter Bedingungen (z. B. Typ, Zeitstempel, Größe) Aktionen mit Standardaktion Ausgabe des Dateinamens rekursiv als Standard TOCTOU-Sicherheitslücke bei -exec, besser mit -execdir whereis sucht komfortabel nach Binärdateien, Handbuchseiten und Quelldateien, auch nach Auffälligkeiten, eine Art Paketverwaltung Dirk Müller: Betriebssysteme I WS 2016/17 13/13