#1 Le 16/11/2019, à 23:26
- metalux
Extraction image Mp3 avec find problème de regex
Bonjour,
Suite à une mauvaise manip avec find pour renommer divers fichiers jpg en .folder.jpg, j'ai supprimé tout les jpg des dossiers dans musique.
Pour réparer mon erreur, find, à nouveau lui devrais me sortir d'affaire mais je n'arrive plus à l'utiliser correctement, je suis un peu rouillé ne l'ayant pas utilisé depuis des lustres.
Mon arborescence est de la forme:
~/Musique/Artiste/Album1/01-Titre
~/Musique/Artiste/Album2/CD1/01 Titre
~/Musique/Artiste/Album2/CD2/01-Titre
~/Musique/Artiste/Album2/CD2/01-Titre
etc....
J'utilise cette commande pour extraire les images des mp3 dans les dossiers respectifs, en ne traitant que le 1er fichier mais ça ne parcoure que quelques fichiers:
find . -name '01.*.mp3' -execdir ffmpeg -i {} .folder.jpg \;
J'ai essayé cette forme vu sur une discussion:
find . \(-name '01.*.mp3' \) -execdir ffmpeg -y -i {} .folder.jpg \;
Cette commande parcourt apparemment tous les fichiers et pas seulement ceux commençant par 01 ce qui est inutile, tous les fichiers d'un album contiennent la même image qui est celle de la pochette de l'album. D'ailleurs je ne comprends pas trop à quoi servent les parenthèses.
Quelle est la bonne syntaxe à utiliser?
Hors ligne
#2 Le 17/11/2019, à 01:09
- jamesbad000
Re : Extraction image Mp3 avec find problème de regex
Bonsoir,
La syntaxe avec les parenthèses est totalement aberrante
Erreur de ma part. On peut utiliser les parenthèses échappées pour changer la priorité de tests reliés par des and/or
Si tu veux sélectionner les fichier commençant par "01" et finissant par ".mp3", et bien il faut enlever le "." après 01. Car le paramètre -name n'utilise pas une expression régulière, mais seulement les métacaractères du shell.
Pour utiliser des expressions régulières, il faut utiliser -regexp. Mais cela s'applique sur le chemin complet. Le mieux est de lire le man de la commande pour comprendre comment ça s'utilise.
Dernière modification par jamesbad000 (Le 17/11/2019, à 13:21)
L'espace et le temps sont les modes par lesquels nous pensons, et non les conditions dans lesquelles nous vivons. (Signé Albert)
Hors ligne
#3 Le 17/11/2019, à 12:07
- metalux
Re : Extraction image Mp3 avec find problème de regex
Merci c'est bien ça, je ne me rappelais plus de cette caractéristique de find. Je suis passé à côté dans le man hier soir, pourtant c'est bien mis en évidence:
-name motif
Fichier dont le nom de base (sans les répertoires du chemin d'accès), correspond au motif du shell. Les métacaractères (« * », « ? », et « [] ») peuvent correspondre à un point « . » au début du nom du fichier (c'est une évolution de findutils-4.2.2, consultez la section CONFORMITÉ AUX STANDARDS plus loin)
j'ai bien traité les fichiers commençant par 01 avec la commande suivante:
find . -name '01*.*' -execdir ffmpeg -y -i {} .folder.jpg \;
jamesbad000
Pour les accolades c'est donc normal que je ne comprenais pas la syntaxe qui me paraissait moi aussi aberrante cf remarque jamesbad000 , je l'ai essayée car ma 1ère commande ne fonctionnait pas et je ne voyais pas mon erreur.
J'ai vu ensuite dans le manuel mais j'avais déjà lancé la commande:
Attention à bien protéger les accolades par des guillemets simples afin d'empêcher leur interprétation en tant que ponctuation du script shell.
Ça a bien fonctionné sans protéger les accolades, quel était le risque?
J'ai environ 90% de mes dossiers qui ont été traités et je m'aperçois que dans les 10% restant le 1er fichier ne commence pas par 01 mais parfois par 1 ou parfois manquant, ça commence au 02. Y a-t-il un moyen avec find de ne traiter que le 1er fichier de chaque dossier au lieu de se baser sur le nom? Ou faut-il prévoir une boucle? Je n'ai pas encore réfléchi à une solution alternative (boucle ou autre), cependant je n'ai rien trouvé qui permette de le faire nativement avec find pour l'instant. Merci de votre aide.
Dernière modification par metalux (Le 17/11/2019, à 22:53)
Hors ligne
#4 Le 17/11/2019, à 12:54
- Watael
Re : Extraction image Mp3 avec find problème de regex
"premier" n'a pas de sens pour un système de fichier.
"premier" sous-entend un ordre donné par le programme qui gère l'affichage de la liste des fichiers, et donc un critère (date, taille... ?)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#5 Le 17/11/2019, à 13:53
- jamesbad000
Re : Extraction image Mp3 avec find problème de regex
Un truc comme ci-dessous devait fonctionner. (je n'ai pas testé avec ffmpeg, mais juste avec echo)
# modifie les délimiteur par défaut. Pour que la commande for ... in découpe les chemins d'accès sur les fins de lignes et non sur les espaces
IFS=$'\n';
# énumère les répertoire et ss répertoire dans $rep
for rep in $(find ./ -type d); do
#cherche des fichiers dans le répertoire $rep sans descendre dans les sous répertoires. Et ne conserve que la 1ère ligne de résultat dans $file
file=$(find $rep -maxdepth 1 -type f | head -n 1);
if [ "$file" != "" ]; then
# echo $file;
ffmpeg -y -i "$file" .folder.jpg
fi;
done
"premier" sous-entend un ordre donné par le programme qui gère l'affichage de la liste des fichiers, et donc un critère (date, taille... ?)
bah. Dans une liste désordonnée il y a quand même un premier élément de la liste...
Dernière modification par jamesbad000 (Le 17/11/2019, à 14:07)
L'espace et le temps sont les modes par lesquels nous pensons, et non les conditions dans lesquelles nous vivons. (Signé Albert)
Hors ligne
#6 Le 17/11/2019, à 14:06
- metalux
Re : Extraction image Mp3 avec find problème de regex
Ok donc il faudrait bien passer par une boucle, c'est pourquoi je n'ai rien trouvé avec find seul. Je teste un peu plus tard et je repasse dire ce qu'il en est.
bah. Dans une liste désordonnée il y a quand même un premier élément de la liste...
+1
Là il n'y a aucune importance, du moment qu'il traite le 1er fichier rencontré et passe au dossier suivant. Quand je disais 1er fichier, j'étais parti sur l'idée de traiter le premier fichier tel qu'il apparaît dans un gestionnaire de fichiers quand on tri par nom (d’où mon idée de départ en traitant 01-titre). Ce n'est pas un impératif, le traitement peut se faire sur n'importe lequel vu que tous les fichiers audios présents contiennent bien la balise image.
Hors ligne
#7 Le 17/11/2019, à 14:27
- Watael
Re : Extraction image Mp3 avec find problème de regex
on ne fait pas for i in $(commande) à cause d'éventuels espaces dans les noms, et
il est préférable de ne pas modifier l'IFS.
find ... -print0 | while read -d '' line; do ...; done
et, dans une liste sans critère de tri, le premier n'est pas forcément premier tout le temps.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#8 Le 17/11/2019, à 15:21
- jamesbad000
Re : Extraction image Mp3 avec find problème de regex
et, dans une liste sans critère de tri, le premier n'est pas forcément premier tout le temps.
Il est vrai que jésus à dit les premiers seront les derniers...
Dernière modification par jamesbad000 (Le 17/11/2019, à 15:32)
L'espace et le temps sont les modes par lesquels nous pensons, et non les conditions dans lesquelles nous vivons. (Signé Albert)
Hors ligne
#9 Le 17/11/2019, à 23:03
- metalux
Re : Extraction image Mp3 avec find problème de regex
@jamesbad000
J'ai essayé le script mais il ne fonctionne pas, le fichier .folder.jpg est crée dans le dossier Musique et non dans les dossiers respectifs "Artiste/Album", du coup, le fichier est bien extrait mais écrase au fur et à mesure le précédent pour finalement rester que le dernier dans le dossier racine (Musique ici).
@Watael
Je prends note de ta remarque pour corriger mais pour ne traiter que un seul fichier du dossier, comment faire?
Je regarde ça quand j'ai un peu plus de temps, mais si l'un de vous est le premier à me donner la réponse, je lui donne ma bénédiction Amen. Ici je cherche d'abord une solution et non pas un exercice mais promis je vais m'y atteler. Le peu que j'ai regardé, je n'ai pas réussi à traiter un seul fichier par dossier.
Hors ligne
#10 Le 17/11/2019, à 23:38
- Watael
Re : Extraction image Mp3 avec find problème de regex
en mode "pas-à-pas" :
shopt -s globstar
for d in ./**/*/
do
for f in "$d"/*
do
if test -f "$f"; then <ta commande>; break; fi
done
done
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#11 Le 18/11/2019, à 00:06
- jamesbad000
Re : Extraction image Mp3 avec find problème de regex
j'ai essayé le script mais il ne fonctionne pas, le fichier .folder.jpg est crée dans le dossier Musique et non dans les dossiers respectifs
Effectivement, j'ai omis de prendre en compte l'effet de -execdir que tu avais du utiliser avec ta commande initiale...
Tu dois pouvoir corriger ce problème en utilisant le nom de répertoire du fichier trouvé qui est dans $rep
ffmpeg -y -i "$file" "${rep}.folder.jpg"
edit: et si tu veux tester la version de Watael, autant que je comprennes, le nom du répertoire est dans $d...
Edit 2: je viens de la tester, mais ça ne descend que dans 2 niveaux de sous-répertoire. Alors que la version avec find est sans limite de profondeur.
Dernière modification par jamesbad000 (Le 18/11/2019, à 00:35)
L'espace et le temps sont les modes par lesquels nous pensons, et non les conditions dans lesquelles nous vivons. (Signé Albert)
Hors ligne
#12 Le 18/11/2019, à 01:17
- Watael
Re : Extraction image Mp3 avec find problème de regex
tu as bien activé globstar ?
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#13 Le 18/11/2019, à 01:59
- jamesbad000
Re : Extraction image Mp3 avec find problème de regex
tu as bien activé globstar ?
A priori oui. Pour être précis j'ai collé ton script d'un bloc dans le terminal après avoir juste remplacé <ta commande>
Ce qui donne
fredk1804@MirageK1804:~$ shopt -s globstar;
fredk1804@MirageK1804:~$ for d in ./**/*/
> do
> for f in "$d"/*
> do
> if test -f "$f"; then echo $d - $f; break; fi
> done
> done
./bin/ - ./bin//cmpF.sh
./Bureau/ - ./Bureau//Adaptation aux profils individuels - Documentation fonctionnelle et technique V1.1.doc
./Documents/dd_wrt/ - ./Documents/dd_wrt//Features.ods
./Documents/Incidents/ - ./Documents/Incidents//bootlopasilver.txt
./Documents/Manuels/ - ./Documents/Manuels//B_E2483HSU-DP-usermanual-f-revE.pdf
./Documents/Math/ - ./Documents/Math//MonteCarloNuls.pdf
...
L'espace et le temps sont les modes par lesquels nous pensons, et non les conditions dans lesquelles nous vivons. (Signé Albert)
Hors ligne
#14 Le 18/11/2019, à 02:25
- Watael
Re : Extraction image Mp3 avec find problème de regex
bizarre, ça fonctionne très bien sur mon poste : je n'ai pas de limite de profondeur.
...
./Téléchargements/273305-a-la-decouverte-d-unix-freebsd.pdf
...
./Téléchargements/BIOS_Acer_2.09_Windows/readme.txt
./Téléchargements/BIOS_Acer_2.09_Windows/DOS/FLASHIT.EXE
./Téléchargements/BIOS_Acer_2.09_Windows/Windows/XEWXX209.exe
...
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#15 Le 18/11/2019, à 11:38
- kamaris
Re : Extraction image Mp3 avec find problème de regex
Encore une histoire de versions de bash ?
globstar n'apparait qu'avec bash 4.0 : https://tiswww.case.edu/php/chet/bash/NEWS
This is a terse description of the new features added to bash-4.0 since
the release of bash-3.2. As always, the manual page (doc/bash.1) is
the place to look for complete descriptions.
[…]
w. There is a new shell option: `globstar'. When enabled, the globbing code
treats `**' specially -- it matches all directories (and files within
them, when appropriate) recursively.
Hors ligne
#16 Le 18/11/2019, à 12:13
- Watael
Re : Extraction image Mp3 avec find problème de regex
le shell couinerait :
$ shopt -s pouicpouic
bash: shopt: pouicpouic : nom d'option du shell non valable
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#17 Le 18/11/2019, à 12:33
- kamaris
Re : Extraction image Mp3 avec find problème de regex
Ah oui c'est vrai (vivement bash 6.0 que l'option pouicpouic soit rajoutée ! )
Hors ligne
#18 Le 21/11/2019, à 00:24
- metalux
Re : Extraction image Mp3 avec find problème de regex
Hello,
Je repasse d'ici une bonne semaine, je dois partir et je verrai ça au retour.
Mais j'ai testé rapidement sans essayer de comprendre dans l'immédiat et ce n'est pas encore 100% fonctionnel. Après ça vient peut-être des fichiers audios (je suspecte leurs noms pour ceux qui échouent) et de ffmpeg, il faudra que je teste manuellement pour le savoir.
Par contre pour ta version @jamesbad000, $rep correspond à nom_de_l'album.folder.jpg et non à .folder.jpg. Et les jpg ne sont pas stockés dans chaque dossier album mais un répertoire au dessus, dans les dossiers artistes. Ce ne doit pas être grand chose, je regarderai et je reviens vous dire dans la quinzaine.
@Watael
Peux-tu m'expliquer:
for d in ./**/*/
?
Si je comprends les doubles étoiles parcourent les dossiers récursivement, du coup je ne comprends pas pourquoi ajouter /*/ . Bon il y a de fortes probabilités que je n'ai pas compris la définition, du coup si tu pouvais m'éclairer à ce sujet S.T.P.
Hors ligne
#19 Le 21/11/2019, à 01:27
- Watael
Re : Extraction image Mp3 avec find problème de regex
mais, c'est une bonne question!
c'est une erreur en effet, bien vu.
le slash final permet de ne garder que les répertoires; il n'y a pas de test à ajouter.
donc,
for d in ./**/; do echo "$d is directory"; done
Connected \o/
Welcome to sHell. · eval is evil.
En ligne