{{tag>Kommandozeile shell bash}} ====== Dateimanipulation mit ''find'' und Schleifen ====== Gelegentlich möchte man die Eigenschaften vieler Dateien auf einmal ändern: Beispielsweise wenn man die Zugriffrechte aller "public_html" Verzeichnisse der Benutzer ändern möchte. Der Linux Befehl //find// kann außer Dateien zu finden, diese auch gleich manipulieren. ==== find und -exec ==== Am besten an obigem Beispiel: Ich möchte gerne, dass alle "public_html" Verzeichnisse die Berechtigung 755 haben, also so: drwxr-xr-x 2 kruijuz lehrer 4096 Nov 15 2004 public_html Das könnte der folgende Befehl leisten: find /home -type d -name public_html -exec chmod 755 {} \; Findet alle Verzeichnisse (-type d) mit dem Namen public_html (-name public_html) und führt (-exec) auf die gefundenen Dateien (repräsentiert durch {}) den Befehl "chmod" 755 aus. Am Ende muss \; mit Leerzeichen davor sein, um das mit dem exec irgendwie zu regeln. === Modifikationen === Um zu sehen, welche Dateien der Befehl verändern würde und um ein Gefühl für die Sache zu bekommen bietet sich: find /home -type d -name public_html -exec echo {} \; an. Wenn die User schon Dateien im ihren public_htmls drinhaben, deren Zugriffsrechte auch geändert werden sollen, kann man die Zugfiffrechte auch rekursiv ändern find /home -type d -name public_html -exec chmod -R 755 {} \; (allerdings haben dann alle normalen Files auch das exec Bit, müsste man nachdenken ob das stört) Im Prinzip kann man jeden Befehl auf die gefundenen Dateien loslassen, also auch löschen und ähnliches - bei solchen Aktionen ist aber natürlich Vorsicht geboten und ein Backup sehr beruhigend. ==== for-Schleifen ==== Ein prima Beispiel, bei dem Schleifen praktisch sind: Sie haben 200 Verzeichnisse, die alle so heißen, wie ihr Besitzer - AKA Homeverzeichnisse, allerdings haben diese den falschen Besitzer, z.B. nach einem Backup mit ungeeigneten Mitteln auf ungeeignete Dateisysteme ;-) Also so: drwxr-s--x 30 admin lehrer 4096 Sep 19 19:13 . drwxrwxrwt 34 root root 12288 Oct 4 18:37 .. drwxr-s--x 10 root root 4096 Sep 19 16:00 holztrla drwxr-s--x 10 root root 4096 Sep 19 15:54 horstmca drwxr-s--x 10 root root 4096 Sep 19 16:00 jhinjeam drwxr-s--x 10 root root 4096 Sep 19 15:56 kepplegw drwxr-s--x 10 root root 4096 Sep 19 16:00 kimmigjo drwxr-s--x 10 root root 4096 Sep 19 15:56 knoellra drwxr-s--x 10 root root 4096 Sep 19 16:01 kramerju Mittel einer einfachen for-Schleife kann man das auf Shell Ebene schnell beheben: for dir in *; do chmod -R $dir.lehrer $dir; done Dabei durchläuft die Variable dir alle Dateien (hier Verzeichnisse) die auf die Wildcard (hier *, also alle) passen. Weil dieser Wert anschließend in $dir zur Verfügung steht, kann man ihn zum anpassen der Eigentunsverhältnisse mittels chmod verwenden.