Skript zum Ausführen von chown für alle Ordner und Festlegen des Besitzers als Ordnername abzüglich des abschließenden /

Skript zum Ausführen von chown für alle Ordner und Festlegen des Besitzers als Ordnername abzüglich des abschließenden /

Irgendein Trottel hat chown -R username. im /home-Ordner auf unserem Webserver ausgeführt und dachte, er sei im gewünschten Ordner. Es ist unnötig zu erwähnen, dass der Server viele Wackler macht.

Wir haben über 200 Websites und ich möchte sie nicht alle einzeln chownen. Deshalb versuche ich, ein Skript zu erstellen, das den Besitzer aller Ordner in den Ordnernamen ohne den abschließenden / ändert.

Das ist alles, was ich bisher habe. Wenn ich das / entfernen kann, ist alles in Ordnung. Ich möchte aber auch prüfen, ob die Datei ein . enthält. Wenn nicht, führen Sie den Befehl aus, andernfalls fahren Sie mit dem nächsten fort.

#!/bin/bash
for f in *

do

    test=$f;
    #manipluate the test variable
    chown -R $test $f

done

Jede Hilfe wäre großartig!

Dank im Voraus!

Antwort1

Vorausgesetzt, dassalleOrdner im Verzeichnis /home/ stellen Benutzernamen dar. Sie können Folgendes verwenden:

for dir in /home/*/; do
    # strip trailing slash
    homedir="${dir%/}"
    # strip all chars up to and including the last slash
    username="${homedir##*/}"

    case $username in
    *.*) continue ;; # skip name with a dot in it
    esac

    chown -R "$username" "$dir"
done

Ich empfehle, vorher eine Testschleife auszuführen und zu prüfen, ob der Benutzername tatsächlich mit einem Home-Verzeichnis übereinstimmt.

Dieser AWK-Befehl ruft das Home-Verzeichnis für einen bestimmten Benutzer ab.

awk -F: -v user="$username" '{if($1 == user){print $6}}' < /etc/passwd

Für den Leser ist es eine Übung, dieses Ergebnis mit dem vorhandenen Home-Verzeichnis zu vergleichen.

Antwort2

Du kannst den ... benutzenBasisnameBefehl zum Bereitstellen der letzten Komponente eines Pfads

for dir in /home/*
do
    if [ -d "$dir" ]
    then
        username=$(basename "$dir")
        chown -R "$username" "$dir"
    fi
done

obwohl ich es zunächst als ausführen würde

for dir in /home/*
do
    if [ -d "$dir" ]
    then
        username=$(basename "$dir")
        echo "chown -R $username $dir"
    fi
done

um sicherzugehen, dass es vernünftig war.

verwandte Informationen