[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:
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:
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.