CHMOD - Anwenden unterschiedlicher Berechtigungen für Dateien und Verzeichnisse

9

Ich habe versucht, die Berechtigungen für ein paar Boxen zu bereinigen, und habe den chmod-Mann sowie die gesamte Internetdokumentation durchsucht, die ich ohne Glück bearbeitet habe - also los geht's.

Grundsätzlich habe ich ein Verzeichnis mit vielen Unterverzeichnissen und Dateien - und ich möchte die folgenden Berechtigungen festlegen:

Für Verzeichnisse: 770 (u + rwx, g + rwx, o-rwx)

Für Dateien: 660 (U + rw, g + rw, ax, o-rw)

Ich möchte versuchen, dies nach Möglichkeit mit einem einzigen rekursiven chmod zu tun, um zu vermeiden, dass jedes Verzeichnis erneut durchlaufen wird und Datei-für-Datei-Berechtigungen festgelegt werden.

Ich kann mir vorstellen, dass es einen Weg geben muss, dies zu tun, ohne ein eigenes Shell-Skript zu schreiben - aber ich konnte nichts finden.

Ich schätze Ihre Hilfe!

Skone
quelle

Antworten:

10

Ich finde ein Skript nützlich, da es oft nützlich ist, sowohl Datei- als auch Verzeichnisberechtigungen auf einen Schlag zu ändern, und sie oft verknüpft sind. 770 und 660 für gemeinsam genutzte Verzeichnisse auf einem Dateiserver, 755/644 für Webserververzeichnisse usw. Ich behalte ein Skript mit dem am häufigsten verwendeten Modus für diesen Servertyp in der Datei bin / und führe die Suche nur manuell durch, wenn dies gemeinsam der Fall ist Modus gilt nicht.

#!/bin/sh
# syntax: setperm.s destdir
#
if [ -z $1 ] ; then echo "Requires single argument: <directoryname>" ; exit 1 ;                                       fi

destdir=$1

dirmode=0770
filemode=0660

YN=no

printf "\nThis will RECURSIVELY change the permissions for this entire branch:\n                                      "
printf "\t$destdir\n"
printf "\tDirectories chmod = $dirmode\tFiles chmod = $filemode\n"
printf "Are you sure want to do this [$YN]? "

read YN

case $YN in
        [yY]|[yY][eE][sS])
        # change permissions on files and directories.
        find $destdir -type f -print0 | xargs -0 chmod $filemode $i
        find $destdir -type d -print0 | xargs -0 chmod $dirmode $ii ;;

        *) echo "\nBetter safe than sorry I always say.\n" ;;
esac
iPaulo
quelle
Beeindruckend! Genau das habe ich gesucht. Vielen Dank!
Skone
Hey iPaulo - kannst du zufällig das "$ ii" in der Zeile "find $ destdir -type d -print0 | xargs -0 chmod $ dirmode $ ii ;;" erklären. Ich bin nicht sicher, ob ich verstehe, warum es nicht einfach "find $ destdir -type d -print0 | xargs -0 chmod $ dirmode $ i ;;" Vielen Dank!
Skone
18

Keine Notwendigkeit für Skripte.

// Verzeichnisse:

find . -type d -exec chmod XXX {} \;

// Dateien:

find . -type f -exec chmod XXX {} \;
Sonnig
quelle
16

In Ihrem Fall muss es möglicherweise nicht so kompliziert sein, wie andere es sich vorgestellt haben (obwohl findes in der Tat ein gutes Werkzeug für solche Dinge im Allgemeinen ist). Der Unterschied zwischen den Modi ist das Ausführungsbit. Wenn für keine Dateien bereits das Ausführungsbit gesetzt ist, können Sie dies in einem einzigen Aufruf von tun chmod, genau wie Sie es gewünscht haben.

chmod -R u=rwX,g=rwX,o= FILE...

Der Schlüssel hier ist das Kapital X, das auf der Manpage erklärt wird

Ausführen / Suchen nur, wenn die Datei ein Verzeichnis ist oder bereits Ausführungsberechtigung für einen Benutzer hat.

Wenn für Ihre Dateien das Ausführungsbit noch nicht gesetzt ist, wird es nur für Verzeichnisse gesetzt.

Mikael Auno
quelle
Das ist großartig, aber viel länger als nur 777 zu schreiben. Gibt es eine Abkürzung für -X?
Elliott B
4

Zumindest für meinen Anwendungsfall war rsyncdas Kopieren des Verzeichnisses auf sich selbst viel schneller als das chmoddirekte Verwenden mit einer Liste von Dateien aus find.

rsync -rpt --chmod=D770,F660 . .

Wenn Sie chowndem gleichen Vorgang ein hinzufügen möchten , rsynckönnen Sie dies auch mit der --chown=user:groupOption tun .

Matthew Bush
quelle
Whoah, das ist eigentlich viel schneller als chmod -R.
Epeli
1

Sauber und einfach:

chmod 660 $(find . -type f)
chmod 770 $(find . -type d)
Takeshin
quelle
Sehr eleganter Ansatz.
user5336
3
Vielleicht, aber beachten Sie, dass dies nur funktioniert, wenn die Dateien keine Leerzeichen enthalten. Ein "sicherer" Ansatz istfind ... -exec chmod ... {} \;
isaaclw