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 08/02/2018, à 03:36

cristobal78

remplacer les car bizarres dans un nom de fichier par des _

Bonjour à tous

afin de n'avoir dans mon home que des fichiers portant des noms "propres" c'est à dire sans {,;:!# etc... je me suis fait ce petit script qui s'active d'un click droit sur le fichier dans l'explorateur (ici nemo).
Le voici:

#!/bin/bash
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Fonction du script = remplace les car. indésirables dans un nom de
# fichier par des underscore 
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 

# à partir du fichier sélectionné "ficsel" on crée un fichier nommé "ficpropre" dont le nom ne contient aucun caractères bizarres 

for ficsel
do  ficpropre=$(echo "$1" | sed 'y/@&#$£§)(][}{=+,;:!?%/____________________/')

# si un fichier porte déjà ce nom (ficpropre) on sort
	if [ -e "$ficpropre" ] ; then zenity --error --width=300 --title="Opération inutile !!!" --text="Fichier sélectionné sans caractères indésirables !" 

# sinon le fichier "ficpropre" remplace le fichier "ficsel"
	else
	mv "$ficsel" "$ficpropre"
	fi
done

J'ai fait autant de test que possible et ça marche parfaitement ... sauf pour le symbole %   sad
Qu'est ce qui manque dans ce script pour que le "%" soit remplacé par un "_"

merci de vos conseils éclairés !


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#2 Le 08/02/2018, à 06:48

Watael

Re : remplacer les car bizarres dans un nom de fichier par des _

salut,

puisque tu ne traites que le premier argument du script, la boucle for est inutile.

le test ne vérifie pas que le nom donné en argument ne comporte pas de caractères indésirables, mais qu'il existe un fichier correspondant au format de sortie souhaité.
le commentaire est correct, l'information de "l'infoBulle" ne l'est pas.

pour le %, est-ce que ce n'est pas un caractère spécial pour Nemo ?
essaie de le protéger dans l'expression sed.

Dernière modification par Watael (Le 08/02/2018, à 06:50)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 08/02/2018, à 17:33

cristobal78

Re : remplacer les car bizarres dans un nom de fichier par des _

@ watael

merci de ta réponse très matinale.

1-
Suite à ta remarque sur la boucle inutile j'ai réécrit le script avec un "while" et un "shift" afin de traiter plusieurs fichiers à la fois. Ça marche (sauf pour %)!

#!/bin/bash
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Fonction du script = remplace les car. indésirables dans un nom de
# fichier par des underscore 
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 
# à partir du premier fichier sélectionné "ficsel" on crée un fichier nommé "ficpropre" dont le nom ne contient aucun caractères bizarres 
# shift permet de passer au fichier suivant

while [ $# -gt 0 ]
do
	ficsel=$1
	ficpropre=$(echo "$ficsel" | sed 'y/@&#$£§)(][}{=+,;:!?%/____________________/')

# si un fichier porte déjà ce nom (ficpropre) on sort
	if [ -e "$ficpropre" ] ; then zenity --error --width=300 --title="Opération inutile !!!" --text="Fichier sélectionné sans caractères indésirables !" 

# sinon le fichier "ficpropre" remplace le fichier "ficsel"
	else
	mv "$ficsel" "$ficpropre"
	fi
	shift
done

2-
Suite à ta remarque sur l'infobulle mal foutue je me dis que le script doit s’arrêter dans 3 cas :

(a) le nom de fichier d'origine ne comporte pas de car. bizarre donc il n'y a rien à faire,
(b) le nom de fichier une fois modifié est identique à un fichier déjà présent dans le dossier. Par exemple le dossier au départ contient 2 fichiers différents : tata et t@ta. Après la cde sed le nom t@ta devient tata et la cde mv écrasera le tata d'origine
(c) le script n'a pas pu transformer le nom de fichier. C'est ce qui m'arrive avec des noms contenant %
Reste à trouver une formule simple à mettre en info bulle !

3-
Comme tu le suggérais j'ai essayé d'échapper le "%" en mettant  " \%"  mais sans succès. Peut être ma syntaxe de l’échappement n'est-elle pas bonne (??)
Ce qui est curieux c'est qu'en ligne de cde dans un terminal ça marche avec le symbole "%" comme on le voit ci dessous avec un fichier nommé "a%b" :

moi@del$> ficsel="a%b"
moi@del$> echo $ficsel
a%b
moi@del$> ficpropre=$(echo "$ficsel" | sed 'y/@&#$£§)(][}{=+,;:!?%/____________________/')
moi@del$> echo $ficpropre 
a_b
moi@del$> 

Pourquoi cette différence  entre la cde en terminal et dans le corps d'un script ?

Dernière modification par cristobal78 (Le 08/02/2018, à 17:37)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#4 Le 08/02/2018, à 18:00

Watael

Re : remplacer les car bizarres dans un nom de fichier par des _

mais pourquoi boucles-tu si tu ne choisis qu'un fichier ?
soit Nemo permet de sélectionner plusieurs fichiers, et la commande doit agir sur une liste de fichiers passés en arguments, et alors il faut une boucle (while comme tu l'as fait dans ta deuxième version, ou avec for var in "$@", mais alors, il faut utiliser "$var")
soit Nemo ne permet de sélectionner qu'un seul fichier à la fois, et alors toute boucle est inutile.

pour l'infobulle,
si tu veux expliquer précisément ce qu'il se passe, il faut trois infobulles (!) et trois tests (if test...; elif test...; elif test...; else...; fi)
rien de plus désagréable qu'un programme qui ne fait rien sans t'expliquer pourquoi.

enfin, je n'utilise pas Nemo. sad

et en protégeant la protection ???
ou avec bash plutôt que sed :

shopt -s extglob
#...
propre="${ficsel//@(%|@|#)/_}"

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 08/02/2018, à 18:21

cristobal78

Re : remplacer les car bizarres dans un nom de fichier par des _

merci de ces remarques

- je boucle parce, oui,  que je veux pouvoir agir sur plusieurs fichiers à la fois ce que permet nemo. En fait je croyais boucler correctement avec for dans la 1-ere version et c'est en te lisant que j'ai compris mon erreur et que c'était for var in "$@" qu'il fallait mettre.
Cela dit comme j'avais déjà fait un script avec while je m'en suis inspiré pour la nouvelle mouture du script.

- Pour l'info bulle je vais modifier selon tes idées de if else etc...
100% d'accord avec : "...rien de plus désagréable qu'un programme qui ne fait rien sans t'expliquer pourquoi..."  smile

- shopt m'est inconnu. Je vais regarder comment ça fonctionne.


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#6 Le 08/02/2018, à 18:46

Watael

Re : remplacer les car bizarres dans un nom de fichier par des _

j'ai compris mon erreur et que c'était for var in "$@" qu'il fallait mettre.

ce n'est pas une erreur : in "$@" est facultatif.
l'erreur c'est de ne pas utiliser "$var" dans le déroulement de la boucle.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#7 Le 13/02/2018, à 15:47

Spirale21

Re : remplacer les car bizarres dans un nom de fichier par des _

Bonjour,
Moi j'aurais utiliser tr à la place de sed (https://www.systutorials.com/docs/linux/man/1-tr/) mais moi je suis feignant :-)
pour sed je regarderai du côté des classe de caractères de grep,
pour le symbole % je pense que tu dois l'échapper par un \

 \%

cordialement


il y a trois manière de faire: la bonne, la mauvaise et la mienne

Hors ligne