Ls -R aide

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

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    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...

    ;-))
    1. 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
      1. Modérateur
        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...

        ;-))
        1. 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
          1. Modérateur
            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
            1. 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 ?
              1. Modérateur
                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]$
                ;-))