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 11/07/2021, à 13:54

christophe_D

[RESOLU][BASH] Différence de comportement ligne de commande et fichier

Bonjour,

Je travail sur un script pour sortir uniquement des fichier type image. Comme je fait fais souvent je test directement en ligne de commande.
Donc voila mon test
Depuis la console

filter="\.(JPG|jpg)"
ls | grep  -E $filter 

J'ai bien la liste des fichiers type JPG ou jpg.
donc je fais un fichier test.sh avec un chmod +x

#!/bin/bash
cd $dir_img #defini plus haut le script
filter="\.(JPG|jpg)"
ls | grep  -E $filter 

Et la ça ne retourne rien !! pourtant la commande cd $dir_img va bien dans le répertoire des images.
Ou est mon erreur ??

Merci

Dernière modification par christophe_D (Le 12/07/2021, à 11:17)


Kubuntu 23.10
Lubuntu 23.10 sur TF103C ;)

Hors ligne

#2 Le 11/07/2021, à 14:00

Watael

Re : [RESOLU][BASH] Différence de comportement ligne de commande et fichier

c'est une mauvaise pratique de parser ls. de plus ta regex n'est pas assez précise : elle remontrait aussi un fichier blajpgbla.txt.

printf '%s\n' *.[jJ][pP][gG]

que veux-tu faire avec la liste de ces fichiers ?


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

En ligne

#3 Le 11/07/2021, à 16:28

christophe_D

Re : [RESOLU][BASH] Différence de comportement ligne de commande et fichier

Enfin de compte ça fonctionne, j'ai juste omis les "
Mais comme tu dit que c'est une mauvaise idée de parser un ls
Je suis partie sur le principe de lister les fichiers du répertoire et ne conserver que la liste des fichiers ayant une extension ici jpg ou JPG (mais j'ai aussi prévu dans la ligne de commande raw et png)

option=$*
/../
cd $dir_image
image_typ=$(echo $option | grep -Eoi "\-t (jpg|png|raw)" | sed 's/\-t//g')
it_low=$(echo $image_typ | tr '[:lower:]' '[:upper:]')
it_upp=$(echo $image_typ | tr '[:upper:]' '[:lower:]')
filter="\.($it_low|$it_upp)$"
ls > $tmp_dir"/test.txt"
cat $tmp_dir"/test.txt" | grep -E "$filter" > $tmp_dir"/lst_img.txt"

Le but est d'avoir uniquement un type d'image sans de potentiel fichiers parasites ( comme Windows laisse traîner dans un répertoire d'image, j'utilise un DD externe )
Après c'est pouvoir au besoin redimensionner , et signer les images en lot. Puis finalement réaliser un time-laps ou assembler des images d'une animation par exemple avec povray.

Dernière modification par christophe_D (Le 11/07/2021, à 16:29)


Kubuntu 23.10
Lubuntu 23.10 sur TF103C ;)

Hors ligne

#4 Le 11/07/2021, à 17:32

Watael

Re : [RESOLU][BASH] Différence de comportement ligne de commande et fichier

c'est dégueu.

shopt -s nullglob nocaseglob extglob
echo "la liste des fichiers jpg png raw :"
printf '%s\n' *.@(jpg|png|raw)
echo "traitement"
# povray *.@(jpg|png|raw) # je ne connais pas la syntaxe de povray

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

En ligne

#5 Le 11/07/2021, à 18:04

jplemoine

Re : [RESOLU][BASH] Différence de comportement ligne de commande et fichier

Je pense qu'un simple find permet de le faire...
après il suffit de faire une boucle et d'affiner avec un file pour trouver les fichier qui sont réellement de type image jpeg / jpg / ..

#!/bin/bash
rep="xxxx"
cd $rep
SAVEIFS=$IFS
IFS=$'\n'
liste=$(find $home -type f -name "*.jpg" -o -name "*.jpeg")
for fichier in $liste
do
  type=$(file "${rep}/${fichier}")
  echo "$fichier --> $type"
done
IFS=$SAVEIFS

- IFS = pour limiter le séparateur à "saut de ligne"
- le but est ensuite de tester le type de fichier.


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Déconnecté jusqu’à nouvel ordre

Hors ligne

#6 Le 11/07/2021, à 18:09

Watael

Re : [RESOLU][BASH] Différence de comportement ligne de commande et fichier

parser la sortie d'une Substitution de commande avec une boucle for n'est pas une bonne pratique, non plus; même en modifiant l'IFS (qui n'est pas non plus la meilleure des pratiques)
n'oubliez pas, il y a toujours un fichier

loi de
Murphy

find est-il réellement requis : il n'a pas été dit qu'il faut descendre dans les sous-répertoires.
et puis, en bash, on peut s'en passer avec globstar.
et si cela ralentit le processus de "listage", il y a toujours -exec dans find.

Dernière modification par Watael (Le 11/07/2021, à 18:15)


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

En ligne

#7 Le 11/07/2021, à 18:39

christophe_D

Re : [RESOLU][BASH] Différence de comportement ligne de commande et fichier

Watael a écrit :

c'est dégueu.

Peut être, mais a ce jour c'est une "méthode" que j'utilise et qui fonctionne.
par contre es ce que le printf permet de d’apurer mon script ?
ps: povray est un créateur d'image de synthèse , et qui permet de générer une série d'image pour faire une vidéo. (la dessus je me suis un peu mal exprimé)
printf je ne connais pas.

Donc du coup, dans ce j'ai fait, l'utilisateur appel le script en utilisant une option -t jpg -p ~/picture/motion/ ou je récupère le type d'image et le dossier. Dans l'idée le ls me sort tout les fichiers du répertoire ( bon logiquement que des images mais bon ... ) dans un fichier text. puis après j'épure avec un expression régulière.

Merci de votre patience.

Dernière modification par christophe_D (Le 11/07/2021, à 18:40)


Kubuntu 23.10
Lubuntu 23.10 sur TF103C ;)

Hors ligne

#8 Le 11/07/2021, à 20:19

Watael

Re : [RESOLU][BASH] Différence de comportement ligne de commande et fichier

le script peut se résumer en deux lignes (montrées au #4) :

#!/bin/bash

shopt -s nullglob nocaseglob extglob
povray *.@(jpg|png|raw) fichierSortie.video

comme je l'ai dit, je ne connais pas la syntaxe de povray, je ne sais donc pas comment lui passer la liste des fichiers à transformer en vidéo.


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

En ligne

#9 Le 12/07/2021, à 11:16

christophe_D

Re : [RESOLU][BASH] Différence de comportement ligne de commande et fichier

merci,

Je vais étudier un peu ce printf, si ça peut alléger et rendre mes scripts plus "light" et plus lisible ( depuis quelques année j'ai appris a commenter mes scripts ou programme, et mettre des variable un peu plus parlante )

Et je te le redit povray n'est pas un logiciel d'assemblage de photo, pour cela j'utilise FFmpeg ( que je tente de maîtriser )

Merci a vous tous


Kubuntu 23.10
Lubuntu 23.10 sur TF103C ;)

Hors ligne

#10 Le 12/07/2021, à 12:29

Watael

Re : [RESOLU][BASH] Différence de comportement ligne de commande et fichier

christophe_D a écrit :

povray est un créateur d'image de synthèse, et qui permet de générer une série d'image pour faire une vidéo.

lol

Dernière modification par Watael (Le 12/07/2021, à 12:31)


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

En ligne