Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/11/2013, à 12:46

hellcoco

Comment lister une suite dimage en une ligne ?

Hello
Je suis un novice dans le monde de linux et je voudrais savoir si il existe un script ou une ligne de commande permettant de lister une suite dimage en une seul  ligne ??

Je m explique, par exemple je suis dans un dossier ou il y a 100 images se nommant IMG_0001 IMG_0002 et ainsi de suite jusqu a IMG_0100
Et je voudrais qu une commande (dans un terminal) me remonte comme info la suite d images sous forme dune ligne de ce genre:
IMG_0001:IMG_0100 (si il y a toutes les images entre 0001 et 0100) ou
IMG_0001:0028-0030:0100 (si l image 0029 n existais pas)

Merci d avance pour votre aide !

Cordialement

Hors ligne

#2 Le 08/11/2013, à 15:51

Hizoka

Re : Comment lister une suite dimage en une ligne ?

il n'y a pas de commande qui te sortira la reponse avec ce formatage.

cela va etre à toi de coder un script.

si tu t'y connais pas, ca va pas etre simple.

Il faut faire une boucle traitant tes fichiers et verifiant leur nom pour voir s'il ne manque pas de chiffre
ou une boucle qui tourne sur la suite de chiffre, qui verifie que le les fichiers portant ces numeros existent

Voila une idée, a toi de remplir le if interne

num=1
while read fichier
do
  # Récupération du numero du fichier
  num_fichier=${fichier#*_}
  
  # Compare le numero du fichier et le numero theorique
  if [[ ${num_fichier} == $(printf "%04d" ${num}) ]]
  then
    echo "Le fichier IMG_${num_fichier} existe"
  else
    echo "Le fichier IMG_${num_fichier} n'existe pas !"
    erreur="True"
  fi
done < <(ls IMG_*.png)

[[ -z ${erreur} ]] && echo "La liste es tininterrompu : IMG_0001.png:IMG_01000.png

KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#3 Le 08/11/2013, à 16:09

Watael

Re : Comment lister une suite dimage en une ligne ?

salut,

question sur le format d'affichage:
pourquoi ne pas reprendre le format utiliser pour les impressions ?

img_001-028,030-100

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#4 Le 08/11/2013, à 16:24

hellcoco

Re : Comment lister une suite dimage en une ligne ?

Merci Hizoka je vais explorer cette piste

Oui Watael, ce n est pas une mauvaise idée, tout ce qui m importe est que ce soit lisible

Hors ligne

#5 Le 09/11/2013, à 07:07

pingouinux

Re : Comment lister une suite dimage en une ligne ?

Bonjour à tous,
Où en es-tu de tes recherches, hellcoco ? J'ai un script à te proposer, mais ne voudrais pas donner une réponse toute faite à ton exercice (si c'en est un), ou te gâcher le plaisir de chercher un peu.

Voici quelques indications sur une manière de faire :

  • Partir du numéro du premier fichier, et faire une boucle infinie en incrémentant le numéro

  • Générer le nom du fichier correspondant et vérifier s'il existe

    • S'il existe, on continue la série en cours, ou on en débute une nouvelle s'il n'y en a pas

    • S'il n'existe pas, on termine la série en cours (une série peut ne contenir qu'un seul élément)

  • Arrêt de la boucle quand on arrive au dernier fichier, qui termine aussi une série

Dernière modification par pingouinux (Le 09/11/2013, à 07:08)

Hors ligne

#6 Le 28/12/2013, à 06:51

pingouinux

Re : Comment lister une suite dimage en une ligne ?

Bonjour hellcoco,
Suite à ton message d'hier soir (pas très explicite, il a fallu que je retrouve de quoi il s'agissait), voici le script en question : liste_images

$ cat liste_images
#!/bin/bash

pref=IMG # Préfixe du nom des fichiers
sep1="-" # Séparateur entre les extrémités d'une série
sep2="," # Séparateur entre deux séries

deb=$(ls "$pref"_* 2>/dev/null|head -1) # Premier fichier
fin=$(ls "$pref"_* 2>/dev/null|tail -1) # Dernier fichier

# Pas de fichier
if [ ! "$deb" ]; then 
   echo "Pas de fichier ${pref}_*"
   exit
fi

n=${deb#*_} # Numéro du premier fichier
serie_en_cours=false

echo -n "${pref}_"
while true
do
 # n   = numéro du fichier
 # fic = nom    du fichier
   fic=$(printf "${pref}_%04d" $n)
   if [ -f "$fic" ]; then
    # Le fichier existe
      ficav=$fic # Nom du dernier fichier traité qui existe
      if ! $serie_en_cours; then
       # Pas de séparateur avant la première série
         [ "$fic" = "$deb" ] || echo -n "$sep2"
         echo -n "${fic#*_}"
         fic_deb_serie="$fic" # Fichier début d'une série
         serie_en_cours=true
      fi
   else
    # Le fichier n'existe pas => fin d'une série
      if $serie_en_cours; then
       # On n'écrit pas la fin de série si identique au début (1 seul élément)
         [ "$ficav" = "$fic_deb_serie" ] || echo -n "$sep1${ficav#*_}"
         serie_en_cours=false
      fi
   fi
   if [ "$fic" = "$fin" ]; then
    # On traite le dernier fichier
      [ "$ficav" = "$fic_deb_serie" ] || echo -n "$sep1${ficav#*_}"
      echo
      break
   fi 
   ((n++)) # Incrémentation du numéro
done

Pour le tester (dans un répertoire ne contenant pas d'autres fichiers IMG_*) :

$ touch IMG_00{01..15}; rm IMG_00{06,08,09,13}

$ ls
IMG_0001  IMG_0003  IMG_0005  IMG_0010  IMG_0012  IMG_0015
IMG_0002  IMG_0004  IMG_0007  IMG_0011  IMG_0014  liste_images

$ ./liste_images
IMG_0001-0005,0007,0010-0012,0014-0015

Hors ligne

#7 Le 28/12/2013, à 07:34

Watael

Re : Comment lister une suite dimage en une ligne ?

salut,

#!/bin/bash
shopt -s extglob nullglob
ar=( IMG_* )
for f in "${ar[@]}"; do Ar[${f##*_+(0)}]="$f"; done
for i in "${!Ar[@]}"
do
   if test -z "$output"
   then
      output="${Ar[i]}"
   else
      if test -n "${Ar[i-1]}"
      then
         printf -vk '%04d' $i
      else
         output="${output}${k:+-$k},$(printf '%04d' $i)"
         unset k
      fi  
   fi  
done
echo "$output"

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne