Ich versuche, ein Shell-Skript zu schreiben, um alle Berechtigungen/Gruppen in einem großen Verzeichnis mit mehreren Unterverzeichnissen beizubehalten und neu zu schreiben, für den Fall, dass sie geändert oder nicht richtig erstellt werden oder wenn die Benutzer/Berechtigungen für dieses Verzeichnis auf einem anderen Computer gespiegelt werden.
Etwas wie:
chown adam:brown /var/blarg
chmod 770 /var/blarg
chown adam:brown /var/blarg/toast.file
chmod 777 /var/blarg/toast.file
...etc
Dies manuell zu tun, wird sehr lange dauern. Ich habe mich gefragt, ob es einen vorhandenen Befehl/ein Skript gibt, um diese Aufgabe auszuführen?
Antwort1
In Anlehnung an @yetis Kommentar habe ich vor einiger Zeit darüber nachgedacht und glaube mich zu erinnern, dass ich zu dem Schluss gekommen bin, dass so etwas wie
find /path/to/dir -printf '%m\t%u\t%g\t%p\0' > filelist
und dann
while read -rd $'\0' perms user group file; do
if [ -e "$file" ]; then
chown "$user:$group" "$file"
chmod "$perms" "$file"
else
echo "warning: $file not found"
fi
done < filelist
würde funktionieren. Den Dateinamen ans Ende der Ausgabe zu setzen und read
Null-Terminatoren anstelle von Zeilenumbrüchen zu verwendensollenMachen Sie es auch für Dateinamen mit Leerzeichen und anderen Sonderzeichen sicher. Je nachdem, von wo aus Sie den zweiten Befehl ausführen möchten, ist es möglicherweise bequemer, den Dateinamen ohne die führende /path/to/dir
Komponente des find
Befehls zu verwenden, d. h. %P
anstelle von %p
.
Antwort2
Wie Yeti in den Kommentaren vorgeschlagen hat, habe ich den Befehl „find“ verwendet, um alle Dateien und Verzeichnisse im Verzeichnis zu finden und ihre Berechtigungen/Besitzer in einem chown- oder chmod-Befehl auszugeben. Ich habe die -v
Option „verbose“ hinzugefügt, damit Sie beim Ausführen der resultierenden Shell-Skripte den Erfolg/die Fehler der Befehle sehen können:
find /var/blarg -printf 'chown -v %u:%g %p\n' > chowns.sh
find /var/blarg -printf 'chmod -v %m %p\n' > chmods.sh
Jetzt müssen Sie nur noch die resultierenden .sh-Dateien ausführbar machen:
chmod +x chowns.sh; chmod +x chmods.sh
Führen Sie sie dann aus und geben Sie das ausführliche Feedback in eine TXT-Datei aus:
./chmods > chmods_results.txt
Boom.
Antwort3
Sie erwähnen events
, und wenn Sie habenWirklichBei vielen Dateien ist es sinnvoll, darauf zu achten. Vielleicht möchten Sie sich ansehen inotifywatch
, das „auf Dateisystemereignisse lauscht“, z. B. Änderungen der Dateiberechtigungen. Auf Debian-basierten Betriebssystemen befindet es sich im Paket inotify-tools
.