#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
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
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.
Dernière modification par Watael (Le 12/07/2021, à 12:31)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne