Ls -R aide

Fermé
Mirah87 Messages postés 4 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 30 décembre 2006 - 9 déc. 2006 à 22:54
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 10 déc. 2006 à 18:40
Bonsoir a tous,
Je suis débutante et je viens de faire un script qui "nettoie" : si je mets log en parametre, il meffacera ts les fichiers ayant pr extensions .log ds le repertoire courant.
Seulement maintenant, je souhaite que cela s'exécute également dans les sous répertoires (récursivement). On ma dit d'appeler le script a linterieur de lui meme ou d'utiliser la commande ls -R, une boucle for ... in ... et 2 variables internes.

Je ne vois pas comment faire. Pouvez vous m'aider s'il vous plait.
Merci d'avance

7 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
9 déc. 2006 à 23:04
Salut,

Peux-tu nous afficher ton script s'il te plaît, Merci.
À mon avis il ne doit pas y avoir grand chose à y changer...

;-))
0
Mirah87 Messages postés 4 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 30 décembre 2006
9 déc. 2006 à 23:15
I=' '
F=' '
SORTIE=' '
ERREUR=0

# I prend la valeur -i si l'utilisateur entre en premier argument -i sinon il garde sa valeur initiale (I=' ').
# F prend la valeur -f si l'utilisateur entre en premier argument -f sinon il garde sa valeur initiale (F=' ').
# Si l'utilisateur a entré l'option -f, alors tous les messages d'erreurs seront dirigés vers /dev/null.


case $1 in
'-i')
I="-i";;
'-f')
F="-f"
SORTIE="2>/dev/null";; # Si l'option est -f, on dirige les erreurs vers /dev/null

*)
ERREUR=1
echo $1 ": option invalide."
echo "Veuillez utiliser -i (mode interactif) oui -f (mode silencieux)";;
esac

# Si l'utilisateur a entré une option valide (ERREUR != 1), alors le programme effacera les fichiers correspondants au 2e argument.
# Selon l'option entrée en premier argument, on aura rm -i ou rm -f.
# Si l'option est -f, les erreurs n'apparaitront pas à l'écran.

if [ $ERREUR -ne 1 ]
then
case $2 in
'emacs')
rm $I $F *~ \#*\# $SORTIE;;
'log')
rm $I $F *.log $SORTIE;;
'latex')
rm $I $F *.log *.aux *.bbl $SORTIE;;
'tout')
rm $I $F *{~,#,.log,.aux,.bbl} $SORTIE;;
*)
echo $2 ": Type de fichier non effaçable.";;
esac
fi
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
10 déc. 2006 à 00:17
De la façon dont est construit ton script, je ne vois pas comment tu pourrais parcourrir et effacer les fichiers correspondants à ton paramètre "$2" récursivements, du moins en employant "ls -R", dans la mesure où cette commande se contente d'afficher les répertoires (et sous-répertoires) et leur contenu sans leur chemin absolu !

Par contre en employant "find" combiné à "-exec", c'est envisageable...
Voilà à titre d'exemple ce que pourrait donner la ligne pour "log" :
find /répertoire -name "*.log" -exec  rm $I $F {} $SORTIE \;
A adapter selon tes besoins...

;-))
0
Javais penser a faire

d=liste des dossiers (je peux les avoir avec ls -R ????)

ensuite
for $d in "liste des dossiers"
t=$d/*.log



et joré just a rajouté $t :
rm $I $F $t log
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
10 déc. 2006 à 10:17
Re-

Non, ce n'est pas la bonne solution.
Comme expliqué dans mon post précédent, "ls -R" ne te renverra qu'une liste de dossiers (et fichiers, il faudrait un truc du genre "ls -R | grep "/$"" pour n'avoir que les répertoires...) sans leur chemin absolu et de ce fait dès que tu auras quitté le répertoire racine, tu auras droits à un message d'erreur pour tous les autres dossiers.

A la limite il vaut mieux un truc du genre :
for rep in $(find -type d); do rm $I $F ${rep}/*.log  ; done
0
Mirah87 Messages postés 4 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 30 décembre 2006
10 déc. 2006 à 15:24
J'ai un autre probleme (plus simple je pense)

Je dois afficher
"Le parametre $i est $k" ou "L'option $j est $k" selon si le parametre commence par un tiret ou pas.

J'ai fait une boucle if [ $k = "-*" ] then echo Loption etc
else echo Le parametre est ...

Mais il m'affiche toujours "Le parametre..." meme si il s'agit d'une option.
Savez vous pourquoi ?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
10 déc. 2006 à 18:40
Re-
[jp@MDK tmpfs]$ set d
[jp@MDK tmpfs]$ echo $1
d
[jp@MDK tmpfs]$ if [ "x$1" = "x-o" ];then echo "option"; else echo "paramètre";fi
paramètre
[jp@MDK tmpfs]$ set -- "-o"
[jp@MDK tmpfs]$ echo $1
-o
[jp@MDK tmpfs]$ if [ "x$1" = "x-o" ];then echo "option"; else echo "paramètre";fi
option
[jp@MDK tmpfs]$
;-))
0