#1 Le 12/08/2019, à 08:31
- Gidi
[RESOLU] Ancien script ne fonctionne plus
Bonjour,
Il y a quelques années en traînant sur les forum, j'avais réussi à me faire un script pour renommer en masse des fichiers.
Mon but était de remplacer les caractères spéciaux dans les noms de fichiers.
Ce script fonctionnait à merveille.
Aujourd'hui il ne fonctionne plus.
Est-ce que le passage en Ubuntu 18 peut en être la cause?
Comme vous avez pu le deviner, je suis une bille en programmation
Voici le code:
#!/bin/bash
for i in `find .`; do
new=`echo $i | sed 'y/àâçéèêëîïôöûùüÂÀÇÉÈÊËÎÏÔÖÙÛÜ&()-;,_!/aaceeeeiioouuuAACEEEEIIOOUUUe-------/'`;
if [ $new != $i ]
then
mv $i $new;
fi
done
shopt -s globstar
rename 's/ /-/g' **
rename 's/--/-/g' **
rename "s/'/-/g" **
Quelqu'un peut-il m'aider à réparer ça?
Dernière modification par Gidi (Le 12/08/2019, à 17:25)
Hors ligne
#2 Le 12/08/2019, à 09:19
- melixgaro
Re : [RESOLU] Ancien script ne fonctionne plus
Salut,
Une copie du message d'erreur montrant que ça ne marche pas stp ?
As-tu réinstallé rename qui n'est pas de série dans ubuntu ?
Le script comporte des erreurs classiques d'écriture, qui ne sont pas bloquantes jusqu'au jour où… ça bloque.
Par exemple, $i et $new doivent être entourés par des guillemets doubles droits pour prévoir le cas où ton nom de fichier comporte des espaces.
mv $i $new
doit devenir
mv "$i" "$new"
(idem dans sur la ligne du if).
La notation `commande` doit être remplacée par $(commande).
Le for in `find .` n'est pas terrible et devrait être remplacé par
while read i
do
...
done < <(find . -type f)
L'option '-type f' permet de ne travailler que sur les fichiers et d'ignorer les dossiers. Tu peux l'enlever si ça ne correspond pas à ton cas d'usage.
new=`echo $i | sed 'y/àâçéèêëîïôöûùüÂÀÇÉÈÊËÎÏÔÖÙÛÜ&()-;,_!/aaceeeeiioouuuAACEEEEIIOOUUUe-------/'`;
doit devenir
new=$(sed 'y/àâçéèêëîïôöûùüÂÀÇÉÈÊËÎÏÔÖÙÛÜ&()-;,_!/aaceeeeiioouuuAACEEEEIIOOUUUe-------/' <<< "$i")
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#3 Le 12/08/2019, à 10:49
- kamaris
Re : [RESOLU] Ancien script ne fonctionne plus
Je ne connais pas trop la commande rename, mais je ne vois pas de mention de cette syntaxe chez moi. Mais de toutes façons, pourquoi l'utiliser, alors que tu utilises déjà sed plus haut, qui peut tout faire ? En incluant les remarques de melixgaro (sans le « -type f » du find qui me semble en trop), voici ce que je te propose :
#!/bin/bash
IFS=''
while read -r i; do
new=$(echo "$i" | sed -E -e "y/àâçéèêëîïôöûùüÂÀÇÉÈÊËÎÏÔÖÙÛÜ&()-;,_! '/aaceeeeiioouuuAACEEEEIIOOUUUe---------/" -e 's/([^-]*)-+([^-]*)/\1-\2/g')
test "$new" != "$i" && mv "$i" "$new"
done < <(find .)
Hors ligne
#4 Le 12/08/2019, à 17:25
- Gidi
Re : [RESOLU] Ancien script ne fonctionne plus
Merci à vous deux pour votre aide.
Melixgaro ta piste était bonne.
Kamaris tu m'as mâché tout le boulot. je ne comprend pas bien
-e 's/([^-]*)-+([^-]*)/\1-\2/g')
Mais ça fonctionne très bien!
Même beaucoup mieux qu'avant!
A l'époque j'avais ajouté la fonction rename car pour ces 3 caractères sed ne fonctionnait pas, peut-être à cause du côté brouillon de mon script.
Vous m'avez évité des heures de recherches, même si ça m’intéresse je n'ai plus trop de temps pour les scripts et autant se l'avouer ... je suis mauvais.
Donc merci beaucoup!!
Hors ligne
#5 Le 12/08/2019, à 17:58
- kamaris
Re : [RESOLU] Ancien script ne fonctionne plus
Ton « rename 's/ /-/g' ** » devait j'imagine remplacer les espaces par des tirets dans tous les noms de fichiers et de répertoires, de manière récursive, à partir de là où il était exécuté. Cela, tu pouvais le faire en rajoutant simplement une espace à la liste des caractères du premier sed -e.
Le « rename "s/'/-/g" ** » devait quant à lui remplacer les guillemets simples par des tirets. Cela, tu pouvais aussi le faire en rajoutant un guillemet simple au premier sed -e, mais en changeant ses guillemets simples englobant par des guillemets doubles, afin que le guillemet simple que tu rajoutes à l'intérieur ne soit pas interprété.
Au final, si tu regardes mon premier sed -e, il est donc de la forme "y/… '/…/" (il y a une espace avant le guillemet simple).
Quant au « rename 's/--/-/g' ** », il devait remplacer les séries de tirets par un seul tiret. Cela, c'est le second sed -e qui le fait. « 's/([^-]*)-+([^-]*)/\1-\2/g' » se lit : remplacer les chaines de la forme « (zéro ou plusieurs caractères différents de -)- répété une ou plusieurs fois(zéro ou plusieurs caractères différents de -) » par « (premier ensemble de caractères différents de -)-(second ensemble de caractères différents de -) ».
En espérant que ce soit plus clair !
Hors ligne
#6 Le 12/08/2019, à 18:35
- Watael
Re : [RESOLU] Ancien script ne fonctionne plus
grrrr!
find... -print0 | while read -rd '' varName; do ...; done
!!!
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 12/08/2019, à 18:40
- kamaris
Re : [RESOLU] Ancien script ne fonctionne plus
Ah oui, ça c'est une habitude que je n'ai pas encore bien prise
Hors ligne
#8 Le 12/08/2019, à 22:13
- Gidi
Re : [RESOLU] Ancien script ne fonctionne plus
Merci pour ces précisions!
En effet si je me retrouvais avec 2 caractères spéciaux collés, ça me donnait 2 tirets, (voir trois dans certains cas) et il fallait que je relance le script pour finir par avoir un seul tiret ^^
Pour Watael... inutile de me donner des explications je n'en suis pas là , c'est entre vous
Hors ligne
#9 Le 12/08/2019, à 22:42
- melixgaro
Re : [RESOLU] Ancien script ne fonctionne plus
Salut,
Watael, peux-tu me dire les inconvénients du while + find que je propose en 2 stp ? en particulier, par rapport qu while + find que tu proposes en 6 (notammement, est-ce que le “find |“ a un avantage par rapport au “done < <(find)“ ?) ?
Merci d'avance
à Gidi,
as-tu gardé le -type f ou pas ? autrement dit, appliques-tu tes modifs aux seuls fichiers ou aux fichiers + dossiers ?
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#10 Le 14/08/2019, à 18:09
- Gidi
Re : [RESOLU] Ancien script ne fonctionne plus
Bonjour Melixgaro,
En fait j'ai pris le script de kamaris tel quel. Et... ça renomme les dossiers aussi (puisque l'option type -f était absente), ce qui m'arrange.
Mais merci pour l'info car je me garde ça pour les cas particuliers où je ne souhaiterai pas modifier les dossiers.
Hors ligne