Dieser Beitrag ist erschienen am 19. April 2009 bei zInformatik (Link) / Veröffentlichung mit freundlicher Genehmigung des Autors / Autor: Marcel Jakobs (zimon) / Lizenz: alle Rechte liegen beim Autor, Details sind beim Autor zu erfragen.
Wenn Sie diesen Artikel weiterverwenden möchten, beachten Sie bitte die Bedingungen des Autors. Vielen Dank.
In der Konsole suchen mit ls, grep, find und locate
von Marcel Jakobs
Da ich ein Fan der Linux-Konsole bin, möchte ich einmal das Thema Suche ansprechen.
Es gibt eine ganze Menge Möglichkeiten, wie man Dateien suchen kann.
Der Tracker ist eine praktische Suche, keine Frage. Aber in manchen Fällen können Shell-Kommandos auch recht hilfreich sein. So kann man mit ihnen z.B. nicht-indizierte Wechselmedien durchsuchen oder Dateien mit bestimmten Eigenschaften finden.
Die vorgestellten Kommandos, die ohne Indexierung funktionieren sollten nicht unüberlegt im Wurzelverzeichnis oder in anderen Verzeichnissen mit sehr vielen Datien und Ordnern genutzt werden, da sie teilweise sehr lange brauchen und viel Last erzeugen können.
Suchkommandos ohne Indexierung
ls und grep
Das Kommando ls ist wohl bekannt, daher hier nur ein paar interessante Optionen, die vielleicht nicht so häufig genutzt werden:
-R Listet rekursiv auch die Dateien der Unterverzeichnisse mit auf
-X Sortiert die Dateien nach ihrem Dateityp (also z.B. erst css, dann alle html-Dateien und danach erst die png-Dateien)
-S Sortiert die Dateien nach ihrer Dateigröße
-t Sortiert die Dateien nach ihrer letzen Änderung
-lh Zeigt die Dateigrößen in einem lesbaren Format an.
Zusammen mit dem grep Kommando kann man nun schon recht gut einzelne Verzeichnisse und (mit der -R Option von ls) deren Unterverzeichnisse durchsuchen.
So listet ein
ls -R | grep png$
alle PNG-Dateien auf. Um genauer zu sein: alle Dateien, die mit png enden also auch eine Datei wie z.B. test.apng
Das Dollar-Zeichen zeigt an, dass der Dateiname dort aufhören soll. Das ^ hingegen zeigt an, dass der Dateiname so beginnen soll: ^test meint alle Dateien die mit “test” beginnen. Der Punkt steht für ein beliebiges Zeichen, der Asterisk (Stern *) für beliebig viele Wiederholungen des letzten Zeichens. Doch dies soll keine Einführung in reguläre Ausdrücke werden. Diese sind in der Wikipedia recht gut beschrieben. (Vielleicht schreib ich auch irgendwann mal was darüber)
Ohne $ werden Dateien angezeigt, die die Zeichenkette “png” im Dateinamen beinhalten.
Praktische Optionen für grep sind
-i schaltet die Unterscheidung zwischen Groß- und Kleinschreibung aus
-E lässt reguläre Ausdrücke nach POSIX standard zu. Statt dessen kann auch egrep benutzt werden.
-r durchsucht auch die Unterverzeichnisse rekursiv. Statt dessen kann auch rgrep benutzt werden.
Mit grep kann man aber auch Dateien nach ihrem Inhalt (durch-) suchen:
grep hallo *
Listet alle Dateien im aktuellen Verzeichnis auf, in denen die Zeichenkette “hallo” vorkommt und gibt die entsprechenden Zeilen aus.
grep -r hallo *
macht das gleiche rekursiv auch für alle Unterverzeichnisse. Auch hier kann die gesuchte Zeichenkette (in diesem Beispiel “hallo”) durch einen regulären Ausdruck beschrieben werden. Der Asterisk gibt an, dass in allen Dateien gesucht werden soll. Hier kann man praktische Einschränkungen machen, wenn z.B. nur in C-Quelltexten gesucht werden soll:
grep hallo *.c
Bei der Angabe der Datei gelten keine regulären Ausdrücke sondern die Regeln der Bash. Wie bei
rm *.c
*.c entspricht nebenbei bemerkt einer Liste aller Dateinamen, die mit .c enden und durch Leerzeichen getrennt sind.
find
Ein weiteres sehr mächtiges Werkzeug, dass ohne Indexierung auskommt ist find.
Mit find kann man z.B. zuletzt geänderte oder geöffnete Dateien suchen:
find -amin -15
listet alle Dateien im aktuellen Ordner und allen Unterordnern auf, die vor 15 Minuten oder kürzer geöffnet wurden. -15 bedeutet “kürzer als”, +10 bedeutet “länger als”.
find -mmin -20
hingegen listet alle Dateien auf, vor weniger als 20 Minuten geändert wurden.
Statt eine Zahl in Minuten anzugeben, kann man auch eine Datei angeben, deren Änderungszeitpunkt als Grenze genommen wird:
find -newer datei.txt
listet alle Dateien auf, deren Änderung neuer sind als die der Datei datei.txt
Statt amin und mmin kann man auch atime und mtime benutzen, um die Zeit in Tagen angeben zu können. Ein Tag ist dann als 24 Stunden definiert. Das bedeutet
find -mtime -2
findet Dateien die jünger als 48 Stunden sind.
Merkhilfe: atime = access time, mtime = modify time, amin = access (time in) minutes, mmin = modify (time in) minutes
Man kann auch große Dateien finden, die viel Speicher belegen:
find -size +1G
sucht alle Dateien, die Größer als 1 Gigabyte sind. Statt G für Gigabyte kann auch M für Megabyte oder k für Kilobyte verwendet werden.
So sucht
find -size -1k
alle Dateien kleiner 1 Kilobyte.
Praktisch ist auch die Suche nach leeren Dateien mittels
find -empty
Schließlich kann man mit find auch nach Dateinamen suchen mittels:
find -name "*.png"
bzw. wenn Groß- und Kleinschreibung ignoriert werden soll:
find -iname "*.png"
Die Anführungszeichen werden benötigt, damit nicht eine Liste der png-Dateien an find übergeben wird sondern genau diese Zeichenkette.
Die maximale Tiefe, die find in Unterverzeichnisse vordringen soll kann mittels -maxdepth begrenzt werden. So sucht
find -maxdepth 1 -emtpy
nach Dateien im aktuellen Verzeichnis und allen Verzeichnissen darin. Jedoch nicht in Verzeichnissen, die in Unterverzeichnissen des aktuellen Ordners liegen.
Auch der Typ einer Datei kann bestimm werden. Um Verzeichnisse von den Suchergebnissen auszuschließen und nur Dateien zu suchen nutzt man die Option -type f. Beispiel:
find -name "test*" -type f
Weitere Typen sind d für Verzeichnisse und l für symbolische Links
Man kann die gefundenen Dateien auch direkt Aktionen unterziehen.
So löscht man mittels -delete die gefundenen Dateien.
find -emtpy -delete
löscht alle leeren Dateien
Es können auch Befehle auf die gefundenen Dateien angewendet werden. So kann man dies auch gut mit grep verbinden um die gefundenen Dateien direkt zu durchsuchen:
find -name "*.txt" -exec grep -Hn hallo "{}" \;durchsucht alle gefundenen Textdateien nach dem String “hallo”. Die Optionen -H und -n (kurz -Hn) bringen grep dazu die Dateinamen und Zeilennummern auszugeben, wie es bei einem normalen grep hallo * passiert (also wenn grep mehrere Dateien durchsuchen soll). Bei der Verwendung mit find muss dies explizit angegeben werden da sonst nur die gefundenen Zeilen ausgegeben werden. Das liegt daran, dass grep für jede Datei einzeln aufgerufen wird.
Suchbefehle mit Index
In der Konsole gibt es auch Suchkommandos, die einen Index besitzen.
whereis
So kann man mit dem Kommando whereis nach Binarys und Manualpages suchen. Recht praktisch, wenn man wissen möchte, wo ein bestimmtes Programm liegt um z.B. darauf zu verlinken.
Beispiel:
whereis gvim
Sucht die Ausführbare Datei von gvim
locate
Mit locate lassen sich durch den verwendeten Index Dateien nach Dateinamen wesentlich schneller suchen als mit den bisher beschrieben Methoden. Dafür aber nur bereits indexierte Dateien, also keine Wechselspeichermedien oder gerade erstellte Dateien. So finde man mit
locate *.tex
alle LaTeX Dateien im gesammten System. (Auch hier kann man die Option -i verwenden um Groß- und Kleinschreibung zu ignorieren.)
Bei Ubuntu wird die Datenbank täglich aktualisiert. Um sie manuell zu updaten kann man den folgenden Befehl benutzen:
sudo updatedb
Auch locate kann man mit grep verbinden um die gefundenen Dateien zu durchsuchen:
locate *.tex | xargs grep hallo
durchucht alle LaTeX (.tex) Dateien im System nach dem String “hallo”.
tracker
Natürlich kann man auch unter der Konsole den Tracker nutzen. Dafür installiert man unter Ubuntu die Tracker-Utils mittels
apt-get install tracker-utils
und kann dann wie gewohnt mit dem Tracker über den Befehl tracker-search suchen:
tracker-search hallo welt
sucht nach Dateien, die die Wörter “hallo” und “welt” beinhalten.
Wenn man den Tracker öfters benutzt, empfiehlt es sich dafür einen alias zu legen. Man kann z.B. in der Datei ~/.bashrc folgende Zeile anhängen:
alias ts=tracker-search
Dann kann man (in einem neuen Konsolenfenster, damit die ~/.bashrc ausgeführt wird) mit
ts hallo
nach “hallo” suchen
Der wesentliche Unterschied zwischen Tracker und locate ist, dass locate nur nach Dateinamen sucht während Tracker auch den Inhalt der Datei durchsucht. Locate arbeitet Systemweit und Tracker normalerweise nur in ausgewählten Verzeichnissen (die in der Konfigurationsdatei ~/.Tracker/tracker.cfg angegeben werden).
Weitere Informationen zu allen Kommandos findet man in den man-Pages (die Manualseiten) indem man z.B. für find
man find
eingibt.
Auch das Ubuntuusers-Wiki enthält zu den hier verwendeten Kommandos entsprechende Artikel.
Autoreninformation:
Marcel Jakobs ist Autor bei zInformatik (Link). Er ist seit Jahren Linux- und Kommandozeilennutzer.
| < Zurück | Weiter > |
|---|





