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 17/11/2019, à 00: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, à 02: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, à 14: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, à 13: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:

man find a écrit :

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

man find a écrit :

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, à 23:53)

Hors ligne

#4 Le 17/11/2019, à 13: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.

Hors ligne

#5 Le 17/11/2019, à 14: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
Watael a écrit :

"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, à 15: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, à 15: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.

jamesbad000 a écrit :

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, à 15: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.

Hors ligne

#8 Le 17/11/2019, à 16:21

jamesbad000

Re : Extraction image Mp3 avec find problème de regex

Watael a écrit :

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, à 16: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 18/11/2019, à 00: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 big_smile 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 18/11/2019, à 00: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.

Hors ligne

#11 Le 18/11/2019, à 01:06

jamesbad000

Re : Extraction image Mp3 avec find problème de regex

metalux a écrit :

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, à 01: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, à 02: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.

Hors ligne

#13 Le 18/11/2019, à 02: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, à 03: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.

Hors ligne

#15 Le 18/11/2019, à 12: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

https://tiswww.case.edu/php/chet/bash/NEWS a écrit :

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, à 13: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.

Hors ligne

#17 Le 18/11/2019, à 13: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 ! big_smile )

Hors ligne

#18 Le 21/11/2019, à 01: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, à 02: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.

Hors ligne