Partage
  • Partager sur Facebook
  • Partager sur Twitter

Afficher rien que les fichiers

Script

    29 août 2015 à 10:51:46

    Bonjour,

    Vu que ls ne propose pas d'option pour afficher seulement les fichiers, j'ai tenté le script suivant, mais il n'applique pas l'option R ...

    for fichier in `ls -RB`
    do
    if [ -f $fichier ]
    then
    echo $fichier
    fi
    done
    Quelqu'un comprend-il pourquoi ?

    Merci

    -
    Edité par bjonk 29 août 2015 à 10:54:13

    • Partager sur Facebook
    • Partager sur Twitter
      29 août 2015 à 11:53:04

      Ton option -R est bien prise en compte. Seulement ce n'est pas une bonne idée d'utiliser ls pour cela.

      Ici, pour la hierarchie suivante :

      foo.jpg
      bar.png
      toto/
          titi.png
          tutu.txt
          salut toi.html
          foo.jpg
          .:
      

      Tu vas te retrouver avec le tableau suivant: (".:" "foo.jpg" "bar.png" "toto:" "titi.png" "tutu.txt" "salut" "toi.html" "foo.jpg" ".:")

      Ton script affichera donc:

      foo.jpg
      bar.jpg
      foo.jpg
      

      D'une manière générale c'est une mauvaise idée d'analyser la sortie de ls, c'est fait pour de l'affichage. http://mywiki.wooledge.org/BashGuide/Patterns#Glob_Patterns-1

      Pour faire ce que tu veux, mieux faut utiliser une fonction récursive et le glob pattern :

      #!/bin/sh
      
      list_recursive() {
        for f in $1/*; do
          [ -f "$f" ] && echo $f || list_recursive $f
        done
      }
      
      list_recursive .
      

      Ce qui te donne :

      ./bar.png
      ./foo.jpg
      ./toto/foo.jpg
      ./toto/salut toi.html
      ./toto/titi.png
      ./toto/tutu.txt
      

      Si tu veux inclure les dotfiles, le mieux, je pense, est d'utiliser shopt.

      #!/bin/sh
      
      shopt -s dotglob
      list_recursive() {
        for f in $1/*; do
          [ -f "$f" ] && echo $f || list_recursive $f
        done
      }
      
      list_recursive .
      

      Ce qui te donne :

      ./bar.png
      ./foo.jpg
      ./toto/.:
      ./toto/foo.jpg
      ./toto/salut toi.html
      ./toto/titi.png
      ./toto/tutu.txt
      

      Enfin, si tu veux exclure les fichiers se terminant par un "~" (comme l'option -B de ls), tu peux rajouter cette ligne au début de la boucle par exemple : [ "$f" = "${f%*~}" ] || continue

      Cette syntaxe ${f%*~} est expliquée ici : http://mywiki.wooledge.org/BashGuide/Parameters#Parameter_Expansion-1

      -
      Edité par PyTony 29 août 2015 à 12:37:20

      • Partager sur Facebook
      • Partager sur Twitter
      Envie de mettre les mains dans le cambouis ? Passez à Funtoo GNU/Linux. DO IT!
        29 août 2015 à 12:40:03

        Coucou,

        Pourquoi pas :

        find . -type f
        • Partager sur Facebook
        • Partager sur Twitter
          29 août 2015 à 12:52:37

          Lol. find obviously, dans quoi je me suis lancé moi... :o

          <mauvaise_foi>find ne fonctionnera pas dans un environnement minimal si une erreur survient au boot et que la partition /usr n'est pas montée. Donc si jamais le script doit être exécuté en "mode rescue", mon script est mieux. :D</mauvaise_foi>

          -
          Edité par PyTony 29 août 2015 à 12:58:19

          • Partager sur Facebook
          • Partager sur Twitter
          Envie de mettre les mains dans le cambouis ? Passez à Funtoo GNU/Linux. DO IT!

          Afficher rien que les fichiers

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown