Benutzer-Werkzeuge

Webseiten-Werkzeuge


 [[anwenderwiki:scripting:shell-find]] 

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.

 [[anwenderwiki:scripting:shell-find]] anwenderwiki/scripting/shell-find.txt · Zuletzt geändert: 2012/12/23 23:20 (Externe Bearbeitung)