2009-10-14 4 views
1

J'ai besoin d'un script qui prend un seul argument de ligne de commande qui est un chemin de répertoire. Le script doit vérifier l'argument pour déterminer s'il s'agit en fait d'un répertoire. S'il s'agit d'un répertoire, le script doit changer le mode de protection de tous les sous-répertoires situés à 600. Si l'argument n'est pas un répertoire, un message approprié doit être imprimé.Comment chmod de sous-répertoires d'un chemin fourni (BASH)

Je

si [-d $ 1]; puis


autre

echo "Ce n'est pas un répertoire"

fi

Fondamentalement, je ne sais pas quoi mettre sur la ligne blanche. Je plaisantais avec chmod mais ma ligne semblait vouloir changer le chemin entré et pas seulement les sous-répertoires.

+0

600 est un masque d'autorisation terriblement étrange pour un répertoire - vous manque le bit d'exécution/de recherche, ce qui rend le répertoire plutôt inutile pour tout le monde autre que root. – ephemient

Répondre

8
 
if test -d "$1"; then 
    find "$1" -type d -exec chmod 600 '{}' \; 
else 
    echo "Not a directory: $1" >&2 
    exit 1 
fi 

Diverses variantes peuvent être plus rapides, mais dépendent de caractéristiques non dans l'ancienne find ou xargs.

find "$1" -type d -exec chmod 600 '{}' + 
find "$1" -type d -print0 | xargs -0r chmod 600 
+0

si personnellement, je passerais l'impression d'un message d'erreur. Le but de l'utilisateur est "après l'exécution de cette commande, tous les sous-répertoires doivent avoir une permission de 600". Si vous lui donnez un fichier, cette condition est remplie car un fichier a zéro sous-répertoire. –

+0

Si je le dessinais, je serais d'accord avec vous: le script serait juste la commande 'find' et rien d'autre. Mais je suis la structure de l'OP, la plupart du temps, ici. – ephemient

+3

roger34 n'était pas clair si '$ 1' devrait aussi être changé en 600. Sinon la commande devrait commencer' find '$ 1 "-mindepth 1 -type d ...' –

0
([ -d "$1" ] && find $1 -type d -mindepth 1 | xargs chmod 600 | true) || echo 'Not a directory' 
+0

3 problèmes avec cette solution: d'abord, il échoue s'il y a des chemins impliqués ont des espaces (solution: utilisez 'find" $ 1 "... -print0 | xargs -0 ...', ou l'option '-exec' de find); deuxièmement, il affiche "Not a directory" si $ 1 est un répertoire, mais une erreur se produit avec chmod (par exemple, vous n'avez pas les permissions pour chmod un sous-répertoire) (solution: utilisez 'if ... then ... else .. . fi' au lieu de '&&' et '||'); enfin, il sort avec le statut 0 (succès) même s'il y avait un problème. –

+0

Étant donné que Ephemient avait déjà fourni ces solutions de rechange, je fournissais simplement la solution d'une ligne plutôt que de reproduire les solutions déjà fournies. Et il est assez facile de résoudre la défaillance du chmod en redirigeant la découverte vers true, par ex. "... 600 | true)". Modification ... – nicerobot

Questions connexes