chmod und chown gleichzeitig?

chmod und chown gleichzeitig?

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 chmodgleichzeitig chownauszuführen?

In der aktuellen Iteration meines Skripts findfü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, finddass 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 rsyncBefehl die entsprechenden Optionen hinzufügen:

rsync <your_options> --chown www-data:www-data --chmod=F775 <source> <destination>

Sie können Präfixe Ffür --chmodDateien und DVerzeichnisse 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.

-0weist xargs an, Eingaben auf Null zu trennen.
-I VARsagt, dass VARals „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, findjede 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 findund des Einen perl).

Und Sie müssen auch nicht viel über Perl wissen, um es zu verstehen.

chown und chmod sind eindeutig genug. -dist dasselbe wie in der Shell [oder dem testBefehl, und der ternäre Operator foo ? bar : bazist 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 -nbedeutet „führe dies einmal für jede Zeile von STDIN aus, Einstellung $_auf die Zeile“
  • -llässt den Zeilenvorschub am Ende jeder Zeile verschwinden (weil das sonst Teil von wird $_)
  • -eist Leuten bekannt, die sich auskennen sed; es besagt, dass dies der auszuwertende/auszuführende Ausdruck ist.

verwandte Informationen