Forum Programmation.shell Boucle for ne prend pas en compte les lignes

Posté par .
Tags : aucun
1
27
jan.
2011
Bonjour,

J'essaye de trier mes fichiers par dossier pour cela je liste mes fichiers pour créer mes dossier comsuit :

ls | awk -F- '{print $1}

resultat :

Alfredo Guitierrez
Aniceto Molina
Celmira Jimenez
Cheche Mendoza
Gabriel Romero
Gerardo Cardenas
Herman Hernandez



Si j'introduit ceci dans une boucle "for in do done", l'entrée est traitée avec chaque mot rencontrée et non pas par ligne .....

for i in `ls | awk -F- '{print $1}'` ; do echo "${i}" ; done ;

resultat :
Alfredo
Guitierrez
Aniceto
Molina


Dans ce cas il m'est impossible de remplacer echo par mkdir dans ma boucle ...
Comment puis je faire ?

D'avance Merci
  • # IFS : modifier le separateur par defaut

    Posté par . Évalué à 2.

    la variable IFS contient par defaut l'espace comme separateur dans un shell.

    un simple IFS='\n' (pour couper au changement de ligne plutot qu'a l'espace) au debut du script devrait faire que for prenne ligne par ligne et non pas mot à mot


    sinon il me semble qu'il doit y avoir une option à awk
    car lui aussi risque d'etre impacter par le changement de l'IFS quand il calcule ses colonnes (print $1) => affiche la premiere colonne
    • [^] # Re: IFS : modifier le separateur par defaut

      Posté par . Évalué à 1.

      Je ne connaissais pas cette variable..


      IFS='\' ;for i in `ls | awk -F- '{print $1}'` ; do echo "${i}" ; done ;


      Pour le mkdir j'ai encore des soucis :

      IFS='\' ;for i in `ls | awk -F- '{print $1}'` ; do mkdir `echo ${i} | sed 's/\ /\\\ /'` ; done ;


      Les répertoires ont un point d'intérogation dans leurs nom :

      $ls
      Beta ?Los Hispanos ?Los Mirlos ?Pastor
      Brothers ?Lizandro Imperial ?Saboreo Molina ?Celmira
  • # ls ?

    Posté par . Évalué à 3.


    for i in * ; do echo "${i}" ; done ;
    • [^] # Re: ls ?

      Posté par . Évalué à 2.

      Pour ne prendre que les noms de fichiers:

      for i in * ; do [ -f "$i" ] && { echo "$i" ; } ; done
      • [^] # Re: ls ?

        Posté par . Évalué à 1.

        En fait c'est une liste de MP3 que je veux classifier par les nom d'auteurs c'est pour cela que fait un awk sur le premier champ.
        Merci
      • [^] # Re: ls ?

        Posté par . Évalué à 2.

        voila une bonne piste de la part de bibi.

        et en faisant le awk sur le echo pour le passer à mkdir...

        for i in * ; do [ -f "$i"] && { mkdir `echo "$i" | awk -F- '{print $1}'`; } ; done

        à tester evidemment (en virant le mkdir et les ` )
        • [^] # Re: ls ?

          Posté par . Évalué à 1.

          J'ai le message d'erreur suivant :

          bash: [: « ] » manquant
          bash: [: « ] » manquant
          bash: [: « ] » manquant
          bash: [: « ] » manquant
          bash: [: « ] » manquant
          bash: [: « ] » manquant



          Je ne comprend pas l'expression do [ -f "$i"] ... Si quelqu'un peut m'en donner une ??
          • [^] # Re: ls ?

            Posté par . Évalué à 1.

            En fait si on fait le awk ce n'est pas la peine de faire do [-f "$i"]

            La commande devient donc :

            for i in *.mp3 ; do mkdir `echo "$i" | awk -F- '{print $1}'` ; done ;


            Cela marche nickel


            Merci pour tout
          • [^] # Re: ls ?

            Posté par . Évalué à 2.

            for i in * ; do [ -f "$i" ] && mkdir "${i%%-*}" ; done
          • [^] # Re: ls ?

            Posté par . Évalué à 1.

            'man bash' section CONDITIONAL EXPRESSIONS

            [ -f "monfichier" ] retourne 0 si le fichier existe et n'est pas un répertoire.

            Pour vérifier:

            [ -f /etc/hosts ]
            echo $?


            Je n'ai jamais utilisé awk, je ne sais pas ce que fait -F- par exemple, à moins que ce ne soit la contraction de -F - ?
            Donc s i je comprends bien tu as des fichiers MP3 qui son nommé de cette forme ?
            Artiste - Titre - .. - .. .mp3 ?

            Dans ce cas, tu peux virer les trucs après le premier '-' comme ça:

            for c in *.mp3 ; do { echo "${c%%-*}" ; } ; done
  • # wala

    Posté par (page perso) . Évalué à 1.

    while read i; do
    echo "$i";
    done << EOF
    $(ls | awk -F- '{print $1}')
    EOF
  • # print $1

    Posté par (page perso) . Évalué à 1.

    bin pour moi le problème c'est print $1
    si tu lui demande d'imprimer que le premier champ bin c'est ce qu'il va faire. point barre

    print $0
    ca devrait mieux marcher

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.