#1 Le 09/09/2018, à 13:17
- visual1956
[RESOLU]extraction du contenu d'une variable syntaxe
bonjour
depuis plusieurs semaines je me suis lancé dans la programmation shell et actuellement je travaille sur un programme destiné à centraliser des photos issues de plusieurs répertoires
en cherchant sur le net des exemple j'ai trouvé ce code
fichiers=$(find "$dossierSource" -type f -iname "*.jpg")
echo "fichiers=$fichiers"
je comprends bien la première ligne qui permet de mettre dans la variable fichiers l'ensemble des chemins vers des jpg du dossier d'origine
et la seconde ligne semble être l'équivalent d'une boucle qui va afficher chaque chemin
Si je comprends le fonctionnement je n'arrive pas à en comprendre la syntaxe
que représente la variable fichiers : un tableau ou ou variable ?
comment la seconde commande permet de parcourir le contenu ?
si j'applique la commande wc -l à cette variable je ne trouve pas le nombre de chemins
comment faire pour récupérer le nombre d'éléments contenus dans cette variable ?
Par avance merci
Dernière modification par visual1956 (Le 10/09/2018, à 12:45)
Hors ligne
#2 Le 09/09/2018, à 16:19
- Watael
Re : [RESOLU]extraction du contenu d'une variable syntaxe
salut,
c'est une variable, et c'est une très mauvaise pratique d'y stocker une liste; utilise un tableau.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 09/09/2018, à 16:31
- pingouinux
Re : [RESOLU]extraction du contenu d'une variable syntaxe
Bonjour,
que représente la variable fichiers : un tableau ou ou variable ?
C'est une variable contenant les noms des fichiers mis bout à bout, séparés par le caractère \n.
comment la seconde commande permet de parcourir le contenu ?
La chaîne de caractères est lue, et chaque nom de fichier imprimé, suivi d'un retour à la ligne (celui contenu dans la chaîne).
si j'applique la commande wc -l à cette variable je ne trouve pas le nombre de chemins
Comment as-tu fait ?
Cette commande devrait marcher si aucun chemin ne contient le caractère \n :
wc -l <<<"$fichiers"
Sinon il faut utiliser un tableau. Voici une méthode :
Création du tableau fichiers
unset fichiers; i=0; while read -d $'\x00' f; do fichiers[$((i++))]="$f"; done < <(find . -type f -iname "*.jpg" -print0)
Lecture du tableau
for f in "${fichiers[@]}";do echo "=$f="; done
Nombre d'éléments
echo ${#fichiers[@]}
Édité : Correction
Dernière modification par pingouinux (Le 09/09/2018, à 16:44)
Hors ligne
#4 Le 09/09/2018, à 17:44
- Watael
Re : [RESOLU]extraction du contenu d'une variable syntaxe
$ unset fichiers
$ while read -d '' f; do fichiers+=( "$f" ); done < <(find . -type f -iname "*.jpg" -print0)
$ printf '=%s=' "${fichiers[@]}"
EDIT:
ou
$ unset fichiers
$ shopt -s dotglob nullglob
$ for f in ./**/*.jpg; do test -f "$f" && fichiers+=( "$f" ); done
Dernière modification par Watael (Le 09/09/2018, à 17:46)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 09/09/2018, à 17:56
- visual1956
Re : [RESOLU]extraction du contenu d'une variable syntaxe
merci pour cette réponse rapide
en effet il faut utiliser un tableau
pingouinux :
j'ai trouvé en parcourant le net un programme qui semble identique à celui que tu proposes par contre on y trouve un IFS
unset result index
. while IFS= read -r -u3 -d $'\0' file; do
result[index++]="$file"
done 3< <(find . -type f -print0)
echo ${result[0]}
J'ai essayé de le comprendre pour le maitrise mais je me pose des questions sur la notion de descripteur de fichier FD ( read -u)
pourriez vous m'éclairer ?
de plus je me heurte à un second problème je désire mettre dans une variable "marque" le résultat de la commande "exiftoll -Make
pour ce faire j'utilise le code suivant
marque= $( exiftool -Make $fichier)
lorsque je lance le programme j'ai le message d'ereur suivant
ligne 18 : Make : commande introuvable
par contre si je fais
echo $( exiftool -Make $fichier)(
La marque s'affiche bien
je n'arrive pas à trouver mon erreur pourriez vous m'aider ?
Par avance merci
Hors ligne
#6 Le 09/09/2018, à 17:58
- Watael
Re : [RESOLU]extraction du contenu d'une variable syntaxe
autre problème -> nouveau sujet !
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 09/09/2018, à 18:47
- Postmortem
Re : [RESOLU]extraction du contenu d'une variable syntaxe
Salut,
Le fait d'utiliser IFS= avant read, ça évite de perdre les éventuels espaces à la fin d'un nom de fichier.
Pour le descripteur 3, je dirais que dans ce cas, ça sert à rien. Par contre, ça permettrait d'insérer une autre commande read dans la boucle, commande qui poserait une question à l'utilisateur par exemple.
Édit :
Tu as une espace en trop après le signe égal :
marque=$( exiftool -Make $fichier)
Dernière modification par Postmortem (Le 09/09/2018, à 18:49)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#8 Le 09/09/2018, à 18:55
- visual1956
Re : [RESOLU]extraction du contenu d'une variable syntaxe
ok pour ouvrir un nouveau fil pour le second problème mais j'aimerais avoir une explication sur le code
while read -d '' f; do fichiers+=( "$f" ); done < <(find . -type f -iname "*.jpg" -print0)
si je comprends bien le find alimente le While qui assure la lecture de la sortie du find et le décompose en lignes qui sont individuellement mises dans le tableau via le do
par contre j'aimerais aussi avoir des explication sur la notion de descripteur de fichier utilisée dans le code que j'ai indiqué
Hors ligne
#9 Le 09/09/2018, à 19:08
- Postmortem
Re : [RESOLU]extraction du contenu d'une variable syntaxe
Essai ceci :
while IFS= read -rd '' fic
do
read -p "Voulez vous traiter le fichier $fic ?" reponse
echo "$reponse"
done < <(find -type f -print0)
Puis ceci :
while IFS= read -ru 3 -d '' fic
do
read -p "Voulez vous traiter le fichier $fic ?" reponse
echo "$reponse"
done 3< <(find -type f -print0)
Dernière modification par Postmortem (Le 09/09/2018, à 19:10)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#10 Le 09/09/2018, à 19:22
- Watael
Re : [RESOLU]extraction du contenu d'une variable syntaxe
justement pas en lignes (un nom de fichier peut être composé de n'importe quel caractère, y compris des passages à la ligne; c'est la raison pour laquelle on emploie -print0), mais en éléments pour les stocker dans une variable transitoire.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#11 Le 09/09/2018, à 20:39
- visual1956
Re : [RESOLU]extraction du contenu d'une variable syntaxe
en tant que débutant je viens d'apprendre qu'il ne faut pas d'espace autour du signe "="
cela m'étonne car générlement les blancs sont ignorés
Hors ligne
#12 Le 10/09/2018, à 12:45
- visual1956
Re : [RESOLU]extraction du contenu d'une variable syntaxe
merci pour vos réponses je clos le fil
Hors ligne