
Ich führe ein Skript aus, um Dateieigentümer und Berechtigungen nach einem Rsync zu korrigieren. Abgesehen von der Frage, wie ich meine Aufgabe am besten erledige, frage ich mich, ob es eine Möglichkeit gibt, beides chmod
gleichzeitig chown
auszuführen?
In der aktuellen Iteration meines Skripts find
führe ich eine zweimalige Verarbeitung von Dateien durch.
find /var/www/mysite -exec chown www-data:www-data {} \;
find /var/www/mysite -type f -exec chmod 775 {} \;
Ich dachte, es wäre schön, wenn ich sowohl die Berechtigungen als auch den Besitzer/die Gruppe mit einem einzigen Befehl ändern könnte. Nach einigem Googeln stellte ich überrascht fest, dass ein solcher Befehl, ein solches Argument oder eine solche Option nicht existiert.
Kann ich sowohl die Berechtigungen als auch den Besitz gleichzeitig ändern, um zu vermeiden, find
dass jede Datei zweimal aufgerufen wird?
BearbeitenEine Bearbeitung oder ein Beitrag der Community oder etwas anderes deutete darauf hin, dass diese Frage ein Duplikat von ist„Ändern Sie alle Ordnerberechtigungen mit 1 Befehl“Diese Frage ist anders, weil sie sich auf die Veränderung beziehtbeideBerechtigungenUnd Eigentumgleichzeitig nicht nur Berechtigungen.
Antwort1
Sie können mehrere Exec-Befehle übergeben:
find /var/www/mysite -exec chown www-data:www-data {} \; \
-type f -exec chmod 775 {} \;
Antwort2
Sie können Ihrem rsync
Befehl die entsprechenden Optionen hinzufügen:
rsync <your_options> --chown www-data:www-data --chmod=F775 <source> <destination>
Sie können Präfixe F
für --chmod
Dateien und D
Verzeichnisse verwenden.
Antwort3
Zur Vollständigkeitxargskann auch in Pipelines alle möglichen interessanten Dinge tun.
find . -type f -print0 | xargs -0 -I VAR -- sh -c 'chmod 775 "VAR" && chown www-data:www-data "VAR" '
Dadurch wird ein Datenstrom von Dateinamen (keine Verzeichnisnamen) mit Nullen als Trennzeichen erzeugt, sodass Leerzeichen in Dateinamen berücksichtigt werden.
-0
weist xargs an, Eingaben auf Null zu trennen.
-I VAR
sagt, dass VAR
als „Variablenname“ verwendet werden soll, anstatt {}
--
und alles danach ist, was für jede Zeile ausgeführt werden soll
Dies ist möglicherweise besser lesbar, es wird jedoch bei jedem Ausführen des doppelläufigen Befehls eine neue Shell gestartet.
Antwort4
Wenn Sie Bedenken haben, find
jede Datei zweimal auszuführen, sollten Sie auch über die Anzahl der Forks nachdenken, die durch das Ausführen einer Befehlskombination über xargs entstehen würden.
Man vergisst oft, dass Perl Äquivalente für viele dieser grundlegenden Shell-Befehle hat. So würde ich das machen (getestet):
find | perl -lne 'chown 1001,1001, $_; -d $_ ? chmod(0755, $_) : chmod(0644, $_)'
Sie müssten dieNumerischuid, gid und mode, aber denken Sie darüber nach:das gibt überhaupt keine Fork(jenseits des Einen find
und des Einen perl
).
Und Sie müssen auch nicht viel über Perl wissen, um es zu verstehen.
chown und chmod sind eindeutig genug. -d
ist dasselbe wie in der Shell [
oder dem test
Befehl, und der ternäre Operator foo ? bar : baz
ist nicht eindeutig auf Perl beschränkt. (Als Bonus können Sie verschiedene Modi für Verzeichnisse und Dateien verwenden.)
Tatsächlich sind es die Optionen, die einer Erklärung bedürfen, wenn Sie neu bei Perl sind. Etwas vereinfacht:
- das
-n
bedeutet „führe dies einmal für jede Zeile von STDIN aus, Einstellung$_
auf die Zeile“ -l
lässt den Zeilenvorschub am Ende jeder Zeile verschwinden (weil das sonst Teil von wird$_
)-e
ist Leuten bekannt, die sich auskennensed
; es besagt, dass dies der auszuwertende/auszuführende Ausdruck ist.