#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