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 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