Bulk-Jobs mit find

Wenn man mal in einem Verzeichnis den gleichen Befehl auf mehrere Dateien oder Verzeichnisse anwenden will, kann einem find eine Menge Arbeit ersparen. Die generelle Syntax ist:

$ find [where] <what>

Für den Ort gibt man entweder ein Verzeichnis an oder man lässt es weg und er nimmt das aktuelle. Als Suchkriterien kann man gigantisch viel definieren. Informationen dazu findet man mit man find. Die wichtigsten sind:

  • -type d – Nur Verzeichnisse suchen
  • -type f – Nur Dateien suchen
  • -iname <string> – Name enthält string (kann Wildcards enthalten)
  • -size +20M – Sucht Dateien, die größer sind als 20 MB
  • -maxdepth 1 – Verhindert das Finden von Unterverzeichnissen

Der wirklich tolle Part von find ist aber die Tatsache, dass man auf den gefundenen Dateien und Verzeichnissen direkt Aktionen ausführen kann. Benutzt man -delete, werden die Treffer direkt gelöscht. Wenn man -exec benutzt, kann man einen Befehl angeben, der für jeden Treffer ausgeführt wird. Dabei kann man {} benutzen, um den Pfad des aktuellen Treffers einzufügen. Die Syntax lautet dann:

$ find [where] <what> -exec <command> [param1 [param2 ...]] \;

Wenn man beispielsweise in allen direkten Unterverzeichnissen des aktuellen Verzeichnisses ein neues Verzeichnis erstellen will, dann kann man das so machen:

$ find . -type d -maxdepth 1 -exec mkdir '{}/newdir' \;

Das kann man auch einfacher formulieren, indem man -execdir benutzt, was den Befehl im Pfad jedes Treffers ausführt:

$ find . -type d -maxdepth 1 -execdir mkdir 'newdir' \;