Dossiers chmod récursifs uniquement ou fichiers uniquement via script ou menu nautilus?

8

Cela a déjà été discuté ici .

Ce que j'aimerais savoir, c'est comment les transformer:

Fichiers récursifs chmod uniquement dans ce dossier:

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

Dossiers récursifs chmod uniquement dans ce dossier:

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

dans un script bash, cela pourrait donc être quelque chose comme:

Pour les fichiers:

rchmodf 744 .

Pour les répertoires:

rchmodd 755 .

et ... peut-être aussi dans une option de menu de clic droit nautilus si c'est possible.

DM8
la source

Réponses:

10

Voici un script que vous pouvez appeler en passant le mode comme premier argument et un ou plusieurs noms de répertoire comme arguments suivants. Sous Linux, si vous ne passez aucun nom de répertoire, ce sera comme si vous aviez passé .(le répertoire courant). Nommez ce script rchmodf, rendez-le exécutable ( chmod a+rx /path/to/rchmodf) et placez-le quelque part sur votre $PATH.

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

Explications: mode=$1; shiftdéfinit la variable modesur le premier argument du script et supprime ce premier argument de la liste. "$@"se développe à la liste de tous les arguments.

Si vous le souhaitez, vous pouvez créer un script qui accepte à la fois un mode répertoire et un mode fichier.

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

Notez que 744 n'est pas un mode de fichier utile; 644 (inscriptibles par l'utilisateur et lisibles par le monde) et 755 (également exécutables par le monde) sont beaucoup plus courants. De plus, changer chaque fichier d'une arborescence pour être exécutable ou ne pas l'être est rarement utile; vous voudrez probablement appeler ce script avec des arguments comme +rX(majuscule X, pour définir le bit exécutable uniquement pour les répertoires et pour les fichiers qui sont déjà exécutables). En fait, le Xmode de symbolique est probablement ce que vous étiez après ces scripts: chmod -R +rX ..

Avec bash ou zsh, il existe une autre façon d'agir récursivement mais uniquement sur les répertoires. Pour bash, vous avez besoin de la version 4 et d'exécuter en shopt -s globstarpremier.

chmod a+rx **/*/

En zsh, vous pouvez agir sur les fichiers que par suffixation (.): chmod a+r **/*(.).

Je vais transmettre la question Nautilus.

Gilles 'SO- arrête d'être méchant'
la source
Ninjas et nincompoops! Vous pouvez utiliser une recherche pour exécuter différentes commandes sur différents jeux de résultats? +1 pour surcharger l'opérateur OR.
Caleb
1

Script lié à par user23538, j'espère que cela ne vous dérange pas.

Je l'ai essayé et ça marche bien. Veuillez noter que si vous utilisez. comme argument de chemin (exécutez-le dans le même répertoire où se trouve le script), il modifie en fait les autorisations de fichier du script sur 644, alors placez-le dans le répertoire ci-dessus.

#!/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
la source
@ user23538 a déjà été chargé de coller le code dans un bloc sur site. Vous ne devriez donc pas poster exactement cela à moins d'avoir quelque chose de plus à ajouter.
HalosGhost
On leur a demandé de le faire, mais ils ne l'ont pas fait. Alors je l'ai fait. C'est ce qui a été demandé, même si je ne suis pas la même personne. Veuillez expliquer pourquoi cela est incorrect?
Kluny
Ahh, j'ai oublié depuis combien de temps l'utilisateur avait posté sa réponse. Si vous trouvez quelque chose à propos de votre réponse à modifier, je serai heureux de retirer mon vote négatif.
HalosGhost
0

J'ai écrit un script qui fait essentiellement ce qui précède mais fournit également un peu de flexibilité pour les options de ligne de commande (autorisations de répertoire et / ou de fichier, ou exclut les deux, il réinitialise automatiquement tout à 755-644). Il vérifie également quelques scénarios d'erreur.

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

user23538
la source
2
Vous devez coller le code ici. De cette façon, nous évitons beaucoup de liens morts à l'avenir. Si vous craignez que les deux versions ne s'éloignent, vous pouvez toujours y laisser le lien pour référence.
l0b0