ADMIN-Tipp: Find-Tutorial (2)

Jede Woche erscheint in unserem Newsletter ein neuer ADMIN-Tipp. Eine Sammlung aller Tipps finden Sie im Archiv der ADMIN-Tipps.

Nachdem der erste Teil des Find-Tutorial die Basics des Programms erklärt hat, soll es dieses Mal darum gehen, wie man die gefundenen Dateien weiterverarbeiten kann.

Nachdem der erste Teil des Find-Tutorial die Grundlagen erklärt hat, verrät die zweite Folge, wie man die gefundenen Dateien weiterverarbeitet. 

Im Prinzip gibt es zwei Möglichkeiten, die mit Find gefundenen Dateien zu verarbeiten: Man kann die Ausgabe des Programms in Pipes oder anderweitig verwenden oder mit der Option "-exec" Befehle auf ein Element der Suche anwenden. Beispielsweise löscht der folgende Befehl alle Dateien mit der Endung ".bak":

find . -name "*.bak" -exec rm {} \;

(Zur Erinnerung: der Punkt ist bei GNU Find überflüssig, wird aber vom BSD Find, etwa auf OS X, verlangt). Die geschweiften Klammern stehen hier für das jeweils gefundene Element. Die ausgeführten Befehle werden mit einem Semikolon abgeschlossen, das man mit dem Backslash quoten muss, damit nicht die Shell selbst es als Abschluss für den Find-Befehl versteht.  Alternativ könnte man in diesem Fall auch die Shell-Expandierung direkt verwenden, solange die maximale Länge nicht überschritten wird:

rm `find -name "*.bak"`

oder, mit der Bash-Shell,

rm $(find -name "*.bak")

Sind in einem solchen Fall sehr viele Dateien zu verarbeiten, ist es besser, eine For-Schleife zu verwenden, etwa

for file in $(find "*.bak"); do
 rm $file
done

Auf die gleiche Art kann man auch in Dateien suchen, wenn man "grep" mit dem Schalter "-H" aufruft, um die gefundene Datei auszugeben:

find . -name "*.txt" -exec grep -H "suchbegriff" {} \;

In manchen Situationen ist es aber günstiger, die Find-Ausgabe per Pipe an einen Befehl weiterzugeben. Hierbei hilft das "xargs"-Kommando, das aus der Standardeingabe eine gewöhnliche Befehlszeile konstruiert, die manche Unix-Tools erwarten. Aus dem obigen Find-Aufruf wird somit:

find . -name "*.txt" | xargs grep -H "suchbegriff"

Ohne "xargs" würde Grep bei diesem Aufruf in den Dateinamen suchen, so aber wie gewünscht in den gefundenen Dateien selbst. 
Um hierbei auch Dateien mit Leerzeichen problemlos zu verarbeiten, bieten GNU wie auch BSD Find die Option "-print0", die als Trennzeichen der gefundenen Elemente das Ascii-Zeichen NUL verwendet. Der Befehl "xargs" besitzt zu diesem Zweck selbst den Schalter "-0". Aus dem obigen Aufruf wird somit

find . -name "*.txt" -print0 | xargs -0 grep "suchbegriff"

Für bestimmte Anwendungen ist auch nützlich, "-printf" zu verwenden, mit dem man die Ausgabe direkt verändern kann, wie mit der gleichnamigen C-Funktion.

13.06.2012

Ähnliche Artikel

comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023