Forum Programmation.shell Problème avec les espaces

Posté par  .
Étiquettes : aucune
0
31
jan.
2006
Bonjour,
J'ai fait un petit script pour sauver un peu d'espace pour mes photos:

#On fous tous les fichiers .jpg du répertoire courant dans une variable
fichiers=`ls -l | grep .jpg`

#Compteur qui servira pour choisir un fichier différent à chaque passage de la boucle.
compteur=0

#Nombre de fichiers .jpg dans le répertoire courant
nbfichiers=`ls -1 | grep .jpg | wc -l`

#Boucle qui prend le nom du fichier, le compresse et le fous dans le dossier compresse.
if [ -w compresse ];then
sleep 0
else
mkdir compresse
echo 'Répertoire "compresse" créé.'
fi

while [ $compteur != $nbfichiers ]; do
let compteur=compteur+1
fichier=`echo $fichiers | cut -d \ -f$compteur`
convert -quality 90 $fichier ./compresse/$fichier
echo "La photo $fichier vient d'être compressée."
done


J'ai fait le test avec 2-3 photos dans un répertoire et tout marchait à la perfection. Par contre, je me suis aperçu que ça ne marchait pas dès qu'il y avait des fichiers avec des espaces. Je sais d'où vient le problème et vous le verrez assez vite (cut sépare les «fichier par un espace»... Donc photo noel.jpg serait 2 fichiers distincts selon mon script.).

Peut-être existe-t-il une solution plus simple? Sinon... J'aurais pensé de sortir le ls en lignes et de prendre chaque ligne comme nom de fichier pour la boucle, mais je ne sais pas très bien comment faire.

Merci de m'aider...

--Un débutant
  • # mode gruik

    Posté par  . Évalué à 1.

    La solution un peu crade et facile (celle que j'utilise :)) est de virer les espaces à coup de tr.

    for i in *.jpg
    do
    mv "$i" `echo $i | tr ' ' '_'` 2>/dev/null
    done
  • # un truc du genre?

    Posté par  (site web personnel) . Évalué à 3.

    if [ ! -w compresse ]  # pourquoi pas un -d ? ca fait quoi si compresse est un fichier?
    then
    mkdir compresse
    echo 'Répertoire "compresse" créé.'
    fi
    
    for fichier in *.jpg ; do
    convert -quality 90 $fichier ./compresse/$fichier
    echo "La photo $fichier vient d'être compressée."
    done
    
    • [^] # Re: un truc du genre?

      Posté par  (site web personnel) . Évalué à 4.

      IFS=$'\x0A' #<= nouveautée
      
      if [ ! -w compresse ]  
      then
      mkdir compresse
      echo 'Répertoire "compresse" créé.'
      fi
      
      for fichier in `ls *.jpg` ; do #<= changement
      convert -quality 90 $fichier ./compresse/$fichier
      echo "La photo $fichier vient d'être compressée."
      done
      
  • # Conseil de lecture pour le bash :

    Posté par  (site web personnel) . Évalué à 2.

  • # mode find

    Posté par  . Évalué à 5.

    c'est faisable en presque 1 ligne avec find.

    #!/bin/sh

    if [ ! -d compresse ]
    then
    mkdir compresse
    echo "Repertoire crée."
    fi

    find . -maxdepth 1 -name "*.jpg" -exec convert -quality 90 {} compresse/{} \;
    echo "Fini"

    • [^] # mode jmefaivraimentchier

      Posté par  . Évalué à 3.

      en 1 ligne

      if [ ! -d compresse ]; then mkdir compresse; echo "Repertoire crée"; fi && find . -maxdepth 1 -name "*.jpg" -exec convert -quality 90 {} compresse/{} \; -printf "%f : OK\n"

Suivre le flux des commentaires

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