2010-01-06 01:56:57 +0000 2010-01-06 01:56:57 +0000
593
593

Wie chmodiert man rekursiv alle Verzeichnisse außer Dateien ?

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

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

Antworten (8)

821
821
821
2010-01-06 01:58:44 +0000

Um Verzeichnissen rekursiv Lese- und Ausführungsrechte zu geben:

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

Um Dateien rekursiv Leserechte zu geben:

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

Oder, wenn es viele Objekte zu verarbeiten gibt:

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

Oder, um das Laichen 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
302
302
302
2010-01-06 03:22:25 +0000

Ein häufiger Grund für diese Art von Dingen ist es, Verzeichnisse auf 755, Dateien aber auf 644 zu setzen. In diesem Fall gibt es einen etwas schnelleren Weg als niks find-Beispiel:

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

Wichtig dabei ist, dass sich Großbuchstaben X anders verhalten als Kleinbuchstaben x. Im Handbuch können wir lesen:

Die Ausführungs-/Suchbits, wenn die Datei ein Verzeichnis ist oder eines der Ausführungs-/Suchbits im ursprünglichen (unmodifizierten) Modus gesetzt ist.

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

14
14
14
2010-01-22 16:14:43 +0000

Wenn Sie sicherstellen wollen, dass die Dateien auf 644 gesetzt sind und sich Dateien im Pfad befinden, die das Ausführungskennzeichen haben, müssen Sie zuerst das Ausführungskennzeichen entfernen. +

Beispiel:

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

Update: dies scheint fehlzuschlagen, weil die erste Änderung (ugo-x) das Verzeichnis unausführbar macht, so dass alle Dateien darunter nicht geändert werden.

4
4
4
2012-09-18 14:00:17 +0000

Ich habe mich entschlossen, dafür selbst ein kleines Skript 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 macht im Grunde genommen den rekursiven chmod, bietet aber auch ein wenig Flexibilität bei den Kommandozeilenoptionen (setzt Verzeichnis- und/oder Dateiberechtigungen oder schließt beides aus - es setzt alles automatisch auf 755-644 zurück). Es prüft auch auf ein paar Fehlerszenarien.

Ich habe auch darüber geschrieben in meinem Blog .

2
2
2
2018-02-21 11:58:41 +0000

Um Verzeichnissen rekursiv Lese- und Ausführungsrechte zu geben:

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

Um Dateien rekursiv Leserechte zu geben:

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

Besser spät als nie, lassen Sie mich niks Antwort auf der Seite der Korrektheit verbessern. 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 (aber Vorsicht, dass sie mit sudo andere Dateien entdecken könnte).

0
0
0
2013-03-26 04:37:44 +0000

Versuchen Sie dieses Python-Skript; es erfordert kein Spawnen von Prozessen und führt nur zwei Syscalls pro Datei aus. Abgesehen von einer Implementierung in C wird es wahrscheinlich der schnellste Weg sein (ich brauchte es, um ein Dateisystem von 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 ein try/catch um den letzten chmod erforderlich, da das chmodding einiger spezieller Dateien fehlschlug.

-1
-1
-1
2018-02-16 09:34:58 +0000

Sie können auch tree:

tree -faid /your_directory | xargs -L1 -I{} bash -c 'sudo chmod 755 "$1"' -- '{}'

verwenden, und wenn Sie den Ordner ebenfalls anzeigen möchten, fügen Sie ein Echo hinzu

tree -faid /your_directory | xargs -L1 -I{} bash -c 'sudo chmod 755 "$1" && echo$1' -- '{}'
-2
-2
-2
2010-01-29 11:56:05 +0000

Sie können das folgende Bash-Skript als Beispiel verwenden. Stellen Sie sicher, dass Sie ihm Ausführungsberechtigungen (755) erteilen. Verwenden Sie einfach ./autochmod.sh für das aktuelle Verzeichnis oder ./autochmod.sh <dir>, um ein anderes Verzeichnis anzugeben.

#!/bin/bash

if [-e $1]; then
    if [-d $1];then
        dir=$1
    else
        echo "No such directory: $1"
        exit
    fi
else
    dir="./"
fi

for f in $(ls -l $dir | awk '{print $8}'); do
    if [-d $f];then
        chmod 755 $f
    else
        chmod 644 $f
    fi
done