Bonjour,
un script que j'ai fait suite à
ce pb: des fichiers (fat32) montés avec des droits qui ne me conviennent pas. Changer le fstab n'est pas une solution (en cas notamment de nouveau matériel) pour ce que je voulais. Avec KDE, il ne me semble pas que ce soit possible (cf. le sujet pré-cité). Avec Gnome, ça marche bien avec gnome-volume-manager (en le configurant à partir de gconf-editor /system/storage/default_options). Cependant, j'ai eu récemment à copier beaucoup de fichiers venant d'un disque en NTFS et il semblerait qu'il ne soit pas possible de spécifier un dmask et un fmask différents (seulement umask a l'air valable comme option dans le man de mount).
Je me retrouvais donc, après l'automount, avec tous les fichiers/dossiers en rwxrwxrwx. J'ai donc fait ce script qui permet de changer
récursivement les droits des dossiers en rwxr-xr-x et des fichiers en rw-r--r--. C'est mon premier script bash, et ce qui me bloquait jusqu'ici était la récursivité. J'ai donc fait un script auto-appelant.
Tout commentaire sera bienvenue, en particulier, j'aimerais votre avis sur l'utilité de la variable $retient; et s'il est nécessaire de spécifier le chemin en absolu (quels riques sinon?).
BUG: si le nom du fichier/dossier contient des espaces, le chmod met une erreur. exemple: si le nom est "foo bar.txt", on a:
chmod: ne peut accéder `foo': Aucun fichier ou dossier de ce type
chmod: ne peut accéder `bar.txt': Aucun fichier ou dossier de ce type
Si vous avez une solution... (Pourtant j'ai bien les guillemets aux lignes 37 et 38, et l'echo de la ligne 36 est correct.) Si, en ligne de commande, je fais un
for i in $(ls); do echo $i; done
J'obtiens:
foo
bar.txt
et si je fais un
for i in "$(ls)"; do echo $i; done
J'obtiens:
foo bar.txt
(sur une seule ligne; donc la suite du script ne peut pas marcher).
Le script:
#!/bin/bash
#Change récursivement tous les fichiers d'un répertoire en rwxr-xr-x
#si répertoire ou rw-r--r-- si fichier régulier.
#S'exécute de n'importe où. Fournir en argument le chemin (en absolu?)
#du répertoire concerné.
if [ -n "$1" ]
# Teste si un argument est présent en ligne de commande.
then
#Je ne sais pas si c'est nécessaire.
retient="$PWD"
commence=$1
else
echo "Il manque le chemin du répertoire à changer."
exit 1
fi
#Le répertoire qui contient tous les fichiers/répertoires à modifier:
cd "$commence"
#Comme mes fichiers (venant de NTFS) sont en rwxrwxrwx, on peut lancer
#un chmod en mode récursif (-R) pour virer le w des go. Le choix de
#garder ou non le x se fait en fonction de la nature du fichier
#(fichier ou répertoire) et est traité dans la boucle for suivante.
chmod -R go-w "$commence" #ça peut être long...
#Choix de ls -A: modifie également les fichiers "cachés" mais pas "."
#et "..", qui sont listés avec ls -a
for nom_fichier in $(ls -A "$commence")
do
#Si c'est un répertoire, les droits sont bons (chmod de la ligne 21)
if [ -d "$nom_fichier" ]
then
echo "$PWD" #histoire de voir la progression
cd "$nom_fichier" #on rentre dedans...
sh $0 "$PWD" #...et on recommence
cd .. #on revient au répertoire parent pour continuer avec
#les autres fichiers
#Si c'est un fichier régulier:
else
chmod -x "$nom_fichier"
fi
done
#utile?
cd "$retient"
exit 0
Merci.