Ihre Suche nach: linux kosole datei suchen

Du kommst von www.google.ch und suchst nach linux kosole datei suchen. Folgende Beiträge könnten Dich auch interessieren:

Nicht gefunden was Du gesucht hast? Dann kannst Du hier mit Google das Web durchsuchen:

Hauptseite

In der Konsole suchen mit ls, grep, find und locate

19. April 2009 von zimon

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.


Schlagworte: , , , , ,



11 Kommentare zu „In der Konsole suchen mit ls, grep, find und locate“

  1. eddy sagt:

    geil! da gehe ich gerade man find durch, da ich schwierigkeiten beim suchen habe und sehe zufällig diesen artikel auf planet.ubuntuusers.de. Perfekt! you made my day! :)

  2. zimon sagt:

    Hallo eddy,
    freut mich, dass Dir der Artikel geholfen hat. :-)

  3. Vain sagt:

    Moin,

    nur weil’s mir grade ins Auge springt:

    find -iname “*.png”

    Die Anführungsszeichen werden nur benötigt, wenn ein Leerzeichen im Suchswort vorkommt (könnten hier also weggelassen werden).

    Die Anführungszeichen werden benötigt, um die Shell Expansion zu verhindern. Sprich, an “find” wird hier als Parameter wirklich “*.png” übergeben. Befände sich aber eine Datei, z.B. bla.png, im aktuellen Verzeichnis und ließest du die Anführungszeichen weg, dann würde das “*.png” zu einem “bla.png” expandieren und auch “bla.png” an “find” übergeben. Mit dem Ergebnis, dass du nur noch alle “bla.png”‘s angezeigt kriegen würdest. ;)

    Um bei sowas nicht durcheinander zu kommen, ist ein einmaliges “set -x” ganz gut. Das zeigt dir dann an, was wie expandiert wurde.

    Cheers!

  4. zimon sagt:

    Hallo Vain,

    vielen Dank für den Hinweis. Leuchtet ein, dass ohne Anführungszeichen eine Liste aller png Dateien des aktuellen Verzeichnisses an find übergeben wird, was find nicht versteht (bzw. wenn es nur eine Datei ist, wird nur nach dieser gesucht).

  5. Wikianer sagt:

    Herzlichen Dank für diesen tollen Artikel!

  6. Martin sagt:

    “ack-grep” (unter Ubuntu heißt das Paket genauso) ist ein schöner Ersatz für “grep”, wenn in Dateien gesucht werden soll. Es werden zum Beispiel keine Backups von Dateien angezeigt, und das Handling ist viel einfacher als das von “grep”.

  7. elostio sagt:

    Danke für diesen ausgezeichneten Artikel! Kleine Anmerkung: bei “find mmin -20″ hast du ein “-” vergessen.

  8. zimon sagt:

    @Martin “ack-grep” kannte ich bisher nicht. Das schaue ich mir auf jeden Fall mal an. Danke für den Tipp. Ich find es zwar wichtig, die Standardkommandos zu beherrschen (dann kommt man auf jedem System zurecht), soll aber nicht heißen, dass man es sich nicht mit zusätzlichen Tools einfacher machen soll/darf :-)



    @elostio: Habs verbessert, vielen Dank für den Hinweis.



    Ich find es klasse, dass der Artikel so vielen gefällt und hilft :-D

  9. CologneTUX sagt:

    Moin!

    Sehr guter Artikel!
    THX!

    CologneTUX

  10. mystic_man sagt:

    Hallo

    Ich finde den Artikel sehr gut. Er wird sicher mein Arbeiten mit Linux noch mehr erleichtern.

    MfG
    mystic_man

  11. SysLord sagt:

    Grandios! Mehr von dieser Art von Anleitungen fuer Linux, dann arbeiten Linux-Neulingen effizienter, und der Frust beim sinnlose-Befehle-lesen sinkt.

Kommentieren

Kommentarlinks könnten nofollow frei sein.


Bloggeramt.de frisch gebloggt Blogverzeichnis - Blog Verzeichnis bloggerei.de