Contenu | Rechercher | Menus

Annonce

La nouvelle clé USB Ubuntu-fr est en prévente
Rendez-vous sur la boutique En Vente Libre

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 12/08/2019, à 09: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 hmm
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, à 18:25)

Hors ligne

#2 Le 12/08/2019, à 10: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, à 11: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, à 18: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, à 18: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, à 19:35

Watael

Re : [RESOLU] Ancien script ne fonctionne plus

grrrr!

find... -print0 | while read -rd '' varName; do ...; done

!!!


eval, c'est mal.

Hors ligne

#7 Le 12/08/2019, à 19:40

kamaris

Re : [RESOLU] Ancien script ne fonctionne plus

Ah oui, ça c'est une habitude que je n'ai pas encore bien prise smile

Hors ligne

#8 Le 12/08/2019, à 23: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à hmm , c'est entre vous cool

Hors ligne

#9 Le 12/08/2019, à 23: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 wink

à 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, à 19: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