IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[bash] getopt + commande find = KO


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 2
    Par défaut [bash] getopt + commande find = KO
    Bonjour,

    j'essaie de créer un script bash permettant d'assigner les mêmes droits à l'utilisateur et au groupe pour un répertoire donné (récursivement).
    Afin de gérer les différentes options de mon script et d'avoir un script "bien fait", je souhaite utiliser la commande getopt.
    Pour rechercher les droits à modifier, j'utilise la commande find.

    Malheureusement, la commande find que j'utilise ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #!/bin/bash
    error(){...exit 1} 
    usage(){...}
    
    # Pas de paramètre 
    [[ $# -lt 1 ]] && error
    
    # -o : options courtes # -l : options longues 
    options=$(getopt -o hd:u:g: -l help,dir:,user:,group: -- "$@") 
    
    # éclatement de $options en $1, $2... 
    set -- $options 
    
    while true; do 
        case "$1" in 
            -d| --dir) ARG_DIR=$2; 
                shift 2;; # on décale la liste des options de 2 ($1 et $2 sont remplacés par $3 et $4 s'ils existent) 
    		-u| --user) ARG_USER=$2;
                shift 2;; # on décale la liste des options de 2 ($1 et $2 sont remplacés par $3 et $4 s'ils existent) 
    		-g| --group) ARG_GROUP=$2;
                shift 2;; # on décale la liste des options de 2 ($1 et $2 sont remplacés par $3 et $4 s'ils existent) 
            -h|--help) usage 
                shift;; # on décale la liste des options de 1 
            --) # fin des options 
                shift # on décale la liste des options de 1 
                break;; 
            *) error 
                shift;; # on décale la liste des options de 1 
        esac 
    done
    
    ###########PROBLEME DE CARACTERE D'ECHAPPEMENT POUR LA COMMANDE FIND#####################
    #echo "find $ARG_DIR -user $ARG_USER 2>/dev/null"
    #set -x
    find $ARG_DIR -user $ARG_USER 2>/dev/null|
    (
    	while read; do
    		RIGHTS=$(stat -c "%a" ${REPLY})
    		GROUP=$(stat -c "%G" ${REPLY})
    		RIGHT_USER=${RIGHTS:0:1}
    		RIGHT_GROUP=${RIGHTS:1:1}
    		RIGHT_OTHERS=${RIGHTS:2:1}
    		DATE=`date "+[%Y-%m-%d %H:%M:%S]"`
    		if [[ $GROUP = $ARG_GROUP ]]
    		then
    			#Evite les cas ou chmod=0 ==> Aucun droit pour user,group et others
    			if [[ $RIGHT_GROUP && $RIGHT_OTHERS ]]
    			then
    				if [ $RIGHT_USER != $RIGHT_GROUP ]
    				then
    					`chmod ${RIGHT_USER}${RIGHT_USER}${RIGHT_OTHERS} ${REPLY}`
    					echo ${DATE}"CHMOD OK:"${RIGHTS}"-->"${RIGHT_USER}${RIGHT_USER}${RIGHT_OTHERS}":"${REPLY}
    				fi
    			fi
    		else
    			echo ${DATE}"**INVALID GROUP**:"${GROUP}":"${REPLY}
    		fi
    	done
    )
    La mode debuggage bash me retourne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [uq6ax7@localhost scripts]$ ./modif_rules_group_vs_user.sh -d /home/uq6ax7/scripts/test/ -u uq6ax7 -g uq6ax7
    + read
    + find ''\''/home/uq6ax7/scripts/test/'\''' -user ''\''uq6ax7'\'''
    Il y a visiblement un problème de caractères d'échappement.
    J'ai cherché un peu partout sur le net et essayé plusieurs choses mais rien à faire: je n'arrive pas à virer ses fameux caractères.

    Bien sûr, lorsque je teste sans utiliser la commande getopt, tout fonctionne correctement.

    Si quelqu'un a une solution, je suis preneur.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [...]
    ARG_USER="$2"
    [...]
    find "$ARG_DIR" -user "$ARG_USER" 2>/dev/null
    [...]
    avec des guillemets


    EDIT : non, ce n'est pas un problème de guillemets (mais il en faut quand même), il faut ajouter l'option -u, --unquoted à getopt
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 2
    Par défaut
    Merci pour l'option --unquoted de getopt. Rien de tel que le man.
    Je n'ai pas encore les bons réflexes visiblement.

    Attention toutefois:
    Les espaces et caractères spéciaux (pour l’interpréteur de commandes utilisé) peuvent poser problème.
    Donc, attention aux noms de fichiers qui peuvent contenir des espaces ou des caractères spéciaux.

    Conseil:
    Pour mieux se rendre compte des erreurs qui peuvent se glisser lors de l'interprétation du code par bash, penser à utiliser le mode "debug":
    (option à mettre en début de code. Plus de détails:http://linux.leunen.com/?p=694)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Scripts BASH & commande Find
    Par GoodWear dans le forum Administration système
    Réponses: 2
    Dernier message: 09/10/2009, 09h25
  2. Incompréhension avec la commande "find"
    Par Charly94 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 28/12/2006, 18h17
  3. Option -prune avec la commande find
    Par gangsoleil dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 21/04/2006, 17h43
  4. La commande Find d'un recordset
    Par christel1982 dans le forum ASP
    Réponses: 22
    Dernier message: 14/11/2005, 20h36
  5. La commande find
    Par Invité4 dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 22/03/2005, 14h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo