Script pour créer un fichier .html pour tous les fichiers dans un dossier

Bonjour à tous,

J’ai une galerie propulsée par minigalnano et dont je suis très satisfait.

Je voudrais faire des commentaires pour les images. Pour cela, il faut rajouter un fichier .html pour chaque image. Voici comment se présente le dossier et les sous-dossiers :

.
├── dossier1
│   ├── comment.html
│   ├── DSC02624.JPG
│   └── ...
├── dossier2
│   ├── comment.html
│   ├── DSC02627.JPG
│   └── ...
└── comment.html

Je voudrais pouvoir créer automatiquement les fichier DSC02624.JPG.html, DSC02627.JPG.html, etc. Je vois mal comment faire par contre… Une idée ? :slight_smile:

Merci d’avance

Salut,

C’est pas les solutions qui manquent. Tu sais coder en quoi ?

salut,

en bash, jouer avec shopt globstar

salut
en bash :

IFS=$'\n'; for i in $(find . -type f |grep JPG$ );do echo $i ; touch $i.html ;done

pas tester mais ca devrait marcher
le IFS= permet de travailler meme si il y a des espaces

non, non.
il est préférable de ne pas modifier l’IFS, et de ne pas utiliser de substitution de commande dans une boucle for.
notez que find possède une “commande” pour traiter les regex si nécessaire, mais ici, ça ne l’est pas.
donc :
find . -type f -iname "*.jpg" -exec <cmd> {} \;
et s’il y a plus d’une commande à exécuter :
find . -type f -iname "*.jpg" -exec sh -c '<cmds> "$1"' sh {} \;
on pourrait même y exécuter une boucle for :
find . -type f -iname "*.jpg" -exec sh -c 'for i do <cmds>; done' sh {} +

mais bon, je reste sur bash :

for f in ./**/*.jpg; do <cmds>; done```

peux-tu préciser pourquoi "il vaut mieux pas"
j’utilise ce type de scripts depuis des annees sans pb
l’avantage est une plus grand lisibilité pour moi

par ailleurs le -iname me parait faux ici, car il travaille sur des images “calibrées” en .JPG pas .jpg et ca m’a déjà éviter des pbs.

ah, mais tu peux bêcher avec une pioche si ça te plaît, et depuis des années si tu n’y vois pas de d’inconvénient.
et un jour, tu te rends compte qu’il existe de bonnes pratiques (“best practices”) !
alors, “tu t’adaptes, ou tu péris” (HG Wells, L’Esprit au bout du rouleau, 1945).

pour répondre clairement à ta question : on peut mettre des alinéas dans le nom d’un fichier.

et, effectivement -iname est un excès de zèle, pareil pour le nocaseglob.
à Esprit de le confirmer…

Je veux juste apprendre
c’est quoi un alinéa dans ce contexte?

et je suis intéressé par ton shopt juste pas encore regardé

touch 'mon
fi
chier'
IFS=$'\n'
for f in $(find -type f); do echo ">$f<"; done
>./mon<
>fi<
>chier<
for f in *; do echo ">$f<"; done
>mon
fi
chier<

Merci pour vos réponses. Je teste tout ça et je reviens vers vous avec la solution qui me convient le mieux. :slight_smile:

J’ai touché un tout petit peu au C, au Python et aux scripts shell mais je ne pratique tellement pas assez qu’à chaque fois, j’oublie un peu tout. J’ai jamais dépassé le niveau débutant par manque d’occasions de pratiquer.

La commande avec find me paraît la plus adaptée, étant donnée qu’elle agit sur une aborescence.

Mais -execdir devrait peut-être remplacer -exec , pour que les fichiers html créés le soient sur la bonne branche (pas testé)

man find indique:

-execdir commande {} +
Semblable à -exec, sauf que la commande indiquée sera exécutée à partir du sous-répertoire contenant le fichier correspondant, qui n’est normalement pas celui à partir duquel vous avez lancé find

Après pas mal d’essais-erreurs, voici la commande qui a fonctionné :

$ find /emplacement/de/la/galerie/ -iname "*.JPG" -execdir sh -c 'touch `echo "$1" | sed "s/\.\///" | sed "s/\.JPG/\.JPG\.html/"`' sh {} \;

Si je suis déjà dans le bon dossier, on peut retirer l’emplacement :

find -iname "*.JPG" -execdir sh -c 'touch `echo "$1" | sed "s/\.\///" | sed "s/\.JPG/\.JPG\.html/"`' sh {} \;

Il y a moyen de faire plus propre, sans aucun doute. Mais ça a fait le job!

J’ai essayé “shopt” mais je n’ai pas réussi à faire quoique ce soit… :-/

shopt -s nullglob globstar nocaseglob
for f in ./**/*.jpg; do :> "${f%.*}.hmtl"; done

C’est beau! :slight_smile:

Au prochain besoin (ce soir ou demain), je tente avec ta commande.
Merci

@Watael, je viens d’essayer ta solution et j’ai un petit soucis :

$ shopt -s nullglob globstar nocaseglob for f in ./**/*.jpg; do :> "${f%.*}.hmtl"; done
bash: erreur de syntaxe près du symbole inattendu « do » 

C’est déjà l’erreur qui m’avait bloqué la dernière fois. :-/ J’ai un peu cherché mais je ne trouve pas comment régler ça.

Bonjour Esprit

Watael t’avait donné deux lignes de commandes.

Si tu veux pouvoir utiliser les deux sur une seule ligne,
il faudra remplacer le retour à la ligne par un ;

shopt -s nullglob globstar nocaseglob; for f in ./**/*.jpg; do :> "${f%.*}.hmtl"; done

@MicP: Effectivement, je n’avais pas vu!

Je n’ai plus d’erreurs. Par contre, ça ne marche tout de même pas. Les fichiers .html ne sont pas créés. Et je n’ai toujours pas compris comment “shopt” est censé fonctionner… :frowning:

[edit une minute plus tard: Je suis con, c’était des fichiers “.png” cette fois et plus des “.JPG” !!

$ shopt -s nullglob globstar nocaseglob; for f in ./**/*.png; do :> "${f%}.html"; done

Ça marche. J’ai modifié entre les accolades {f%.*} => {f%} pour avoir l’extension d’origine avant le “.html” (nécessaire pour MinigalNano).

le signe pourcent n’est plus utile, alors.
pas plus que les accolades.

C’est noté! :slight_smile: Merci encore