Ls -R aide

[Fermé]
Signaler
Messages postés
4
Date d'inscription
samedi 9 décembre 2006
Statut
Membre
Dernière intervention
30 décembre 2006
-
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
-
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

Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 881
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...

;-))
Messages postés
4
Date d'inscription
samedi 9 décembre 2006
Statut
Membre
Dernière intervention
30 décembre 2006

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
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 881
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...

;-))
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
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 881
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
Messages postés
4
Date d'inscription
samedi 9 décembre 2006
Statut
Membre
Dernière intervention
30 décembre 2006

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 ?
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 881
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]$
;-))