it-swarm.com.de

Wie chmod rekursiv alle Verzeichnisse mit Ausnahme von Dateien?

Wie chmod 755 alle Verzeichnisse, aber keine Datei (rekursiv)?

Umgekehrt, wie man nur Dateien (rekursiv) aber kein Verzeichnis chmod?

555
Olivier Lalonde

So geben Sie rekursiv Verzeichnisse Lese- und Ausführungsrechte:

find /path/to/base/dir -type d -exec chmod 755 {} +

So geben Sie rekursiv files Leserechte:

find /path/to/base/dir -type f -exec chmod 644 {} +

Oder wenn es viele zu verarbeitende Objekte gibt:

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)

Oder, um das Auftreten von chmod zu reduzieren:

find /path/to/base/dir -type d -print0 | xargs -0 chmod 755 
find /path/to/base/dir -type f -print0 | xargs -0 chmod 644
778
nik

Ein häufiger Grund dafür ist, dass Verzeichnisse auf 755 und Dateien auf 644 gesetzt werden. In diesem Fall gibt es einen etwas schnelleren Weg als das find-Beispiel von nik:

chmod -R u+rwX,go+rX,go-w /path

Bedeutung:

  • -R = rekursiv;
  • u+rwX = Benutzer können lesen, schreiben und ausführen;
  • go+rX = Gruppe und andere können lesen und ausführen;
  • go-w = Gruppe und andere können nicht schreiben

Hierbei ist zu beachten, dass sich X in Großbuchstaben anders verhält als x in Kleinbuchstaben. Im Handbuch können wir lesen:

Die Ausführungs-/Suchbits, wenn die Datei ein Verzeichnis ist, oder eines der Ausführungs-/Suchbits werden in den ursprünglichen (nicht modifizierten) Modus versetzt.

Mit anderen Worten, chmod u + X in einer Datei setzt das Ausführungsbit nicht. und g + X setzt es nur, wenn es bereits für den Benutzer eingestellt ist.

281
bobince

Wenn Sie sicherstellen möchten, dass die Dateien auf 644 gesetzt sind und sich im Pfad Dateien mit dem Ausführungsflag befinden, müssen Sie zuerst das Ausführungsflag entfernen. + X entfernt das Ausführungsflag nicht von Dateien, die es bereits haben.

Beispiel:

chmod -R ugo-x,u+rwX,go+rX,go-w path

Update: Dies scheint fehlzuschlagen, da das Verzeichnis bei der ersten Änderung (ugo-x) nicht mehr ausführbar ist, sodass alle Dateien darunter nicht geändert werden.

13
mpolden

Ich beschloss, selbst ein kleines Skript dafür zu schreiben.

Rekursives chmod-Skript für Verzeichnisse und/oder Dateien - Gist :

chmodr.sh

#!/bin/sh
# 
# chmodr.sh
#
# author: Francis Byrne
# date: 2011/02/12
#
# Generic Script for recursively setting permissions for directories and files
# to defined or default permissions using chmod.
#
# Takes a path to recurse through and options for specifying directory and/or 
# file permissions.
# Outputs a list of affected directories and files.
# 
# If no options are specified, it recursively resets all directory and file
# permissions to the default for most OSs (dirs: 755, files: 644).

# Usage message
usage()
{
  echo "Usage: $0 PATH -d DIRPERMS -f FILEPERMS"
  echo "Arguments:"
  echo "PATH: path to the root directory you wish to modify permissions for"
  echo "Options:"
  echo " -d DIRPERMS, directory permissions"
  echo " -f FILEPERMS, file permissions"
  exit 1
}

# Check if user entered arguments
if [ $# -lt 1 ] ; then
 usage
fi

# Get options
while getopts d:f: opt
do
  case "$opt" in
    d) DIRPERMS="$OPTARG";;
    f) FILEPERMS="$OPTARG";;
    \?) usage;;
  esac
done

# Shift option index so that $1 now refers to the first argument
shift $(($OPTIND - 1))

# Default directory and file permissions, if not set on command line
if [ -z "$DIRPERMS" ] && [ -z "$FILEPERMS" ] ; then
  DIRPERMS=755
  FILEPERMS=644
fi

# Set the root path to be the argument entered by the user
ROOT=$1

# Check if the root path is a valid directory
if [ ! -d $ROOT ] ; then
 echo "$ROOT does not exist or isn't a directory!" ; exit 1
fi

# Recursively set directory/file permissions based on the permission variables
if [ -n "$DIRPERMS" ] ; then
  find $ROOT -type d -print0 | xargs -0 chmod -v $DIRPERMS
fi

if [ -n "$FILEPERMS" ] ; then
  find $ROOT -type f -print0 | xargs -0 chmod -v $FILEPERMS
fi

Es führt im Grunde genommen das rekursive chmod aus, bietet aber auch ein wenig Flexibilität für Befehlszeilenoptionen (setzt Verzeichnis- und/oder Dateiberechtigungen oder schließt beides aus, setzt automatisch alles auf 755-644 zurück). Es wird auch nach einigen Fehlerszenarien gesucht.

Ich habe auch darüber geschrieben auf meinem Blog .

4
francisbyrne

So geben Sie rekursiv Verzeichnisse Lese- und Ausführungsrechte:

find /path/to/base/dir -type d -exec chmod 755 {} \;

So geben Sie rekursiv files Leserechte:

find /path/to/base/dir -type f -exec chmod 644 {} \;

Besser spät als nie lass mich Niks Antwort auf die Seite der Korrektheit bringen. Meine Lösung ist langsamer, aber sie funktioniert mit einer beliebigen Anzahl von Dateien, mit beliebigen Symbolen in Dateinamen, und Sie können sie mit Sudo normal ausführen (achten Sie jedoch darauf, dass Sudo möglicherweise andere Dateien erkennt).

2
Peter K

Probieren Sie dieses Python-Skript aus. Es erfordert kein Spawnen von Prozessen und führt nur zwei Systemaufrufe pro Datei aus. Abgesehen von einer Implementierung in C wird dies wahrscheinlich die schnellste Möglichkeit sein (ich brauchte sie, um ein Dateisystem mit 15 Millionen Dateien zu reparieren, die alle auf 777 gesetzt waren).

#!/usr/bin/python3
import os
for par, dirs, files in os.walk('.'):
    for d in dirs:
        os.chmod(par + '/' + d, 0o755)
    for f in files:
        os.chmod(par + '/' + f, 0o644)

In meinem Fall war um das letzte chmod ein try/catch erforderlich, da das chmodding einiger spezieller Dateien fehlgeschlagen ist.

0
mic_e