Rekursive chmod nur Ordner oder nur Dateien über Skript oder Nautilus-Menü?

8

Dies wurde bereits zuvor hier diskutiert .

Was ich wissen möchte, ist, wie man diese dreht:

Rekursive chmod nur Dateien in diesem Ordner:

find . -type f -exec chmod 0600 {} \;

Nur rekursive chmod-Ordner in diesem Ordner:

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

in ein Bash-Skript, so könnte es so etwas sein wie:

Für Dateien:

rchmodf 744 .

Für Verzeichnisse:

rchmodd 755 .

und ... vielleicht auch in eine Nautilus-Rechtsklick-Menüoption, wenn das möglich ist.

DM8
quelle

Antworten:

10

Hier ist ein Skript, das Sie aufrufen können, indem Sie den Modus als erstes Argument und einen oder mehrere Verzeichnisnamen als nachfolgende Argumente übergeben. Wenn Sie unter Linux keinen Verzeichnisnamen übergeben, ist dies so, als hätten Sie .(das aktuelle Verzeichnis) übergeben. Benennen Sie dieses Skript rchmodf, machen Sie es ausführbar ( chmod a+rx /path/to/rchmodf) und platzieren Sie es irgendwo auf Ihrem $PATH.

#!/bin/sh
mode=$1; shift
find "$@" -type f -exec chmod "$mode" {} +

Erläuterungen: mode=$1; shiftSetzt die Variable modeauf das erste Argument des Skripts und entfernt dieses erste Argument aus der Liste. "$@"Erweitert die Liste aller Argumente.

Wenn Sie möchten, können Sie ein Skript erstellen, das sowohl einen Verzeichnismodus als auch einen Dateimodus akzeptiert.

#!/bin/sh
dir_mode=$1; shift
file_mode=$1; shift
find "$@" -type d -exec chmod "$dir_mode" {} + -o -type f -exec chmod "$file_mode" {} +

Beachten Sie, dass 744 kein nützlicher Dateimodus ist. 644 (vom Benutzer beschreibbar und weltweit lesbar) und 755 (auch von der Welt ausführbar) sind weitaus häufiger. Außerdem ist es selten sinnvoll, jede Datei in einem Baum so zu ändern, dass sie ausführbar oder nicht ausführbar ist. Sie möchten dieses Skript wahrscheinlich mit Argumenten wie +rX(Großbuchstaben X, um das ausführbare Bit nur für Verzeichnisse und für Dateien zu setzen, die bereits ausführbar sind) aufrufen . In der Tat ist der Xsymbolische Modus wahrscheinlich das, wonach Sie mit diesen Skripten gesucht haben : chmod -R +rX ..

Mit bash oder zsh gibt es eine andere Möglichkeit, rekursiv zu handeln, jedoch nur für Verzeichnisse. Für Bash benötigen Sie Version 4 und müssen shopt -s globstarzuerst ausgeführt werden.

chmod a+rx **/*/

In zsh können Sie auf Dateien nur mit dem Suffix (.): chmod a+r **/*(.).

Ich werde die Nautilus-Frage weitergeben.

Gilles 'SO - hör auf böse zu sein'
quelle
Ninjas ein Nincompoops! Sie können eine Suche verwenden, um verschiedene Befehle für verschiedene Ergebnismengen auszuführen? +1 zum Überladen des OP-Operators.
Caleb
1

Skript von user23538 verlinkt, hoffe es macht Ihnen nichts aus.

Ich habe es versucht und es funktioniert gut. Bitte beachten Sie, dass, wenn Sie verwenden. Als Pfadargument (führen Sie es in demselben Verzeichnis aus, in dem sich das Skript befindet) ändert es tatsächlich die Dateiberechtigungen des Skripts in 644, also legen Sie es in das obige Verzeichnis.

#!/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
Kluny
quelle
@ user23538 wurde bereits angewiesen, den Code vor Ort in einen Block einzufügen. Sie sollten dann nicht genau das posten, es sei denn, Sie haben etwas mehr hinzuzufügen.
HalosGhost
Sie wurden angewiesen, aber sie taten es nicht. So tat ich. Das wurde verlangt, auch wenn ich nicht dieselbe Person bin. Bitte erklären Sie, warum dies falsch ist.
Kluny
Ahh, ich habe verpasst, wie lange es her ist, dass der Benutzer seine Antwort gepostet hat. Wenn Sie etwas zu Ihrer zu bearbeitenden Antwort finden, werde ich gerne meine Abwahl entfernen.
HalosGhost
0

Ich habe ein Skript geschrieben, das im Grunde das oben Genannte tut, aber auch ein wenig Flexibilität für Befehlszeilenoptionen bietet (Verzeichnis- und / oder Dateiberechtigungen oder beide ausschließen, es setzt automatisch alles auf 755-644 zurück). Es wird auch nach einigen Fehlerszenarien gesucht.

http://bigfloppydonkeydisk.blogspot.com.au/2012/09/recursively-chmod-only-files-or.html

user23538
quelle
2
Sie sollten den Code hier einfügen. Auf diese Weise vermeiden wir in Zukunft viele tote Links. Wenn Sie sich Sorgen machen, dass die beiden Versionen auseinander driften, können Sie den Link trotzdem als Referenz dort lassen.
10b0