#51 Le 03/04/2025, à 23:15
- iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
et sinon :
((NbScan++))pareil , mieux , moins bien ?
Hors ligne
#52 Le 03/04/2025, à 23:47
- Watael

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
encore un peu lourd, mais c'est bien aussi.
et puis, j'aime bien contredire que le shell n'est pas typé, alors je promeus declare -i. ![]()
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#53 Le 04/04/2025, à 00:10
- iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
je fais un test de rapidité d' execution :
14872 répertoires et fichiers traités, 0 répertoires modifiés, 0 fichiers modifiés
0 fichiers , 0 répertoires n ' ayant pas pu etre modifiés , le tout en 163 secondes.
liste des fichiers modifiés dans '/tmp/modifs'
liste des erreurs dans '/tmp/error.log'
version sans declare !
pour supprimer les dossiers vides , copiez collez la commande suivante : find '/datas/iznobe/Documents' -type d -empty -deletela version avec arrive dans 2 minutes . mais elle me parait plus longue .
ba , que neni , c' est exactement pareil ![]()
14872 répertoires et fichiers traités, répertoires modifiés, fichiers modifiés
fichiers , répertoires n ' ayant pas pu etre modifiés , le tout en 163 secondes.
liste des fichiers modifiés dans '/tmp/modifs'
liste des erreurs dans '/tmp/error.log'
version avec declare !
pour supprimer les dossiers vides , copiez collez la commande suivante : find '/datas/iznobe/Documents' -type d -empty -delete
iznobe@iznobe-pc:/datas/iznobe/Scripts$Dernière modification par iznobe (Le 04/04/2025, à 00:12)
Hors ligne
#54 Le 04/04/2025, à 00:17
- iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
Bon cette fois j' en ai fini ( au moins pour ce soir
) et pour te faire plaisir la version avec les entiers et ajout d' une option qui remplace tous les espaces :
#!/bin/bash
# Description des variables :
# $nomOriginal = nom complet rep ou fichier original
# $pathOriginal = chemin du repertoire original
# $nomModif = nom complet rep ou fichier modifié
# $pathModif = chemin du repertoire modifié
# $nomArgModif = nom dernier argument modifié
# variables a ajuster :
modif_activ=false # mettre : true pour appliquer les modifications , false pour visualiser les noms sans les modifier
all_spaces=false # mettre : true pour remplacer tous les espaces partout dans les noms de dossiers et de fichiers
execDir="" # Pour appliquer dans un dossier specifique , mettre le chemin absolu du dossier ici .
#### FIN ####
shopt -s globstar
### Liste des fichiers exclus
Exclus=(CON PRN aux NUL COM1 COM2 COM3 COM4 COM5 COM6 COM7 COM8 COM9 LPT1 LPT2 LPT3 LPT4 LPT5 LPT6 LPT7 LPT8 LPT9)
declare -i LongPath NbScan NbRep NbFile NbRepModified NbFileModified NbRepNOTModified NbFileNOTModified; Debut=$(date +%s);
echo "liste des erreur ( fichiers ou dossiers ) n ' ayant pas pu etre modifiés :" > /tmp/error.log
echo "-------------------" > /tmp/modifs
for nomOriginal in "${execDir:=$PWD}/"**/*; do
NbScan+=1
nomModif=$( echo "$nomOriginal" | sed 's@ */ *@/@g' ) # traitement des espaces
# remplacement d'un maxima de caractères interdits par windows : ><\:"|?* par " _ " + les espaces dans les noms .
if [ $all_spaces = true ]; then
nomModif=$( echo "$nomModif" | tr '><"|?*:\\ ' '_________%' ) # version all spaces .
else
nomModif=$( echo "$nomModif" | tr '><"|?*:\\' '________%' ) # echappement de "\" par le meme signe donc 2 \\ pour qu un soit remplacé
fi
nomArgModif=$( echo "$nomModif" | grep -o '[^/]*$' ) # Récupére le dernier argument
if [[ " ${Exclus[*]} " == *" $nomArgModif "* ]]; then nomModif+=_ ; fi # Vérifions si le nom n'est pas interdit.
if [[ "${#nomArgModif}" -ge 248 || "${#nomModif}" -ge 32384 ]] ; then # Vérifions si la longueur n'est pas excessive
LongPath=$((LongPath+1))
echo "chemin de fichier / dossier trop long ! $LongPath : $nomModif" >> /tmp/error.log
fi
if [[ "$nomOriginal" != "$nomModif" ]]; then # si il y a un changement a effectuer
if test -d "$nomOriginal" ; then # si c' est un dossier
NbRep+=1
if test -e "$nomModif" ; then # on verifie si il existe un dossier du meme nom avant de renommer
NbRepNOTModified+=1
echo "$NbRep un dossier du meme nom existe deja : $nomModif impossible de renommer $nomOriginal" >> /tmp/error.log
else # si pas de dossier du meme nom , on renomme
if [ "$modif_activ" = true ] ; then
mkdir -p "$nomModif"
echo "on va renommer le répertoire avec la commande suivante : mkdir $nomOriginal => $nomModif"
if test -e "$nomModif" ; then # si la creation du repertoire a reussi , on enregistre
echo "$NbScan CREER_REP : mkdir $nomModif" >> /tmp/modifs
NbRepModified+=1
else
NbRepNOTModified+=1
echo "$NbScan erreur inconnue pour repertoire : $nomOriginal" >> /tmp/error.log
fi
fi
fi
elif test -f "$nomOriginal" ; then # si c est un fichier
NbFile+=1
if test -e "$nomModif" ; then # on verifie si il existe un fichier du meme nom avant de renommer
NbFileNOTModified+=1
echo "$NbScan un fichier du meme nom existe deja : $nomModif impossible de renommer $nomOriginal" >> /tmp/error.log
else # si pas de fichier du meme nom , on renomme
pathOriginal=${nomOriginal%/*} # chemin du repertoire original
pathModif=${nomModif%/*} # chemin apres modif
if [[ "$pathOriginal" != "$pathModif" ]]; then # si les chemins sont differents , c' est que l' arborescence a été modifiée :
nomModif="$pathModif"/"$nomArgModif" # dans ce cas on utilise l' arborescence modifiée precedemment + le nom modifié du dernier argument pour la destination
fi
echo "on va renommer ce fichier avec la commande suivante : mv $nomOriginal => $nomModif"
if [ "$modif_activ" = true ] ; then
mv "$nomOriginal" "$nomModif"
if test -e "$nomModif" ; then # on verifie que le fichier renommé existe bien , si le fichier existe on incremente et on enregistre
echo "$NbScan RENOM : mv $nomOriginal en : $nomModif" >> /tmp/modifs
NbFileModified+=1
else
NbFileNOTModified+=1
echo "$NbScan erreur inconnue pour fichier : $nomOriginal" >> /tmp/error.log
fi
fi
fi
else
NbFileModified+=1
echo "$NbScan erreur inconnue pour : $nomOriginal" >> /tmp/error.log
fi
fi
done
echo ""
echo "$NbScan répertoires et fichiers traités, $NbRepModified répertoires modifiés, $NbFileModified fichiers modifiés"
echo "$NbFileNOTModified fichiers , $NbRepNOTModified répertoires n ' ayant pas pu etre modifiés , le tout en $(($(date +%s)-Debut)) secondes."
echo ""
echo "liste des fichiers modifiés dans '/tmp/modifs'"
echo "liste des erreurs dans '/tmp/error.log'"
echo ""
if [[ "$LongPath" -ne 0 ]]; then echo "vous avez $LongPath répertoires de taille trop importante. Voir le détail dans /tmp/error.log" ; fi
echo "pour supprimer les dossiers vides , copiez collez la commande suivante : find '${execDir:=$PWD}' -type d -empty -delete"Si tu vois d' autres choses qui ne vont pas , ou qui peuvent être améliorées ...
Dernière modification par iznobe (Le 04/04/2025, à 00:49)
Hors ligne
#55 Le 14/04/2026, à 08:35
- iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
Bonjour , j ' ai ajouté le script a mon github .
Hors ligne
#56 Le 14/04/2026, à 19:07
- iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
à la place de :
nomModif=$( echo "$nomModif" | tr '><"|?*:\\' '________%' ) # echappement de "\" par le meme signe donc 2 \\ pour qu un soit remplacétu met :
nomModif=$( echo "$nomModif" )et ca devrait ne faire que le remplacement des espaces en début et fin de nom .
Hors ligne
#57 Le 14/04/2026, à 19:26
- Watael

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
pas avec les guillemets.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#58 Le 14/04/2026, à 19:35
- iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
Salut @Watael :
nomModif=$(echo $nomModif)pour éviter que le nom soit coupé au cas où il y a des espaces dedans ?
réponse de shellcheck :
^-------^ SC2086 (info): Double quote to prevent globbing and word splitting.Dernière modification par iznobe (Le 14/04/2026, à 19:37)
Hors ligne
#59 Le 14/04/2026, à 20:32
- Watael

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
le shell va s'occuper de ça; il ne s'agit ici que d'un echo, tout ses arguments peuvent lui être passé sans guillemets.
par contre, tous les espaces consécutifs seront remplacés par un seul, pas uniquement ceux de début et de fin.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#60 Le 14/04/2026, à 21:22
- iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
Bon , modification du script , il y avait effectivement un bug pour les espaces en début et fin de nom .
#!/bin/bash
# Description des variables :
# $nomOriginal = nom complet rep ou fichier original
# $pathOriginal = chemin du repertoire original
# $nomModif = nom complet rep ou fichier modifié
# $pathModif = chemin du repertoire modifié
# $nomArgModif = nom dernier argument modifié
# variables a ajuster :
modif_activ=false # mettre : true pour appliquer les modifications , false pour visualiser les noms sans les modifier
all_spaces=false # mettre : true pour remplacer tous les espaces partout dans les noms de dossiers et de fichiers
execDir="" # Pour appliquer dans un dossier specifique , mettre le chemin absolu du dossier ici .
#### FIN ####
shopt -s globstar
### Liste des fichiers exclus
Exclus=(CON PRN aux NUL COM1 COM2 COM3 COM4 COM5 COM6 COM7 COM8 COM9 LPT1 LPT2 LPT3 LPT4 LPT5 LPT6 LPT7 LPT8 LPT9)
declare -i LongPath=0 NbScan=0 NbRep=0 NbFile=0 NbRepModified=0 NbFileModified=0 NbRepNOTModified=0 NbFileNOTModified=0; Debut=$(date +%s);
echo "liste des erreur ( fichiers ou dossiers ) n ' ayant pas pu etre modifiés :" > /tmp/error.log
echo "-------------------" > /tmp/modifs
for nomOriginal in "${execDir:=$PWD}/"**/*; do
NbScan+=1
nomModif=$(echo $nomOriginal | sed 's@ */ *@/@g') # traitement des espaces en debut et fin du nom
# remplacement d'un maxima de caractères interdits par windows : ><\:"|?* par " _ " + les espaces ( uniques et restant ) dans les noms .
if [ $all_spaces = true ]; then
nomModif=$(echo $nomModif | tr '><"|?*\\ :' '________%') # version all spaces .
else
nomModif=$(echo $nomModif | tr '><"|?*\\:' '_______%') # echappement de "\" par le meme signe donc 2 \\ pour qu un soit remplacé
fi
nomArgModif=$(echo "$nomModif" | grep -o '[^/]*$' ) # Récupére le dernier argument
if [[ " ${Exclus[*]} " == *" $nomArgModif "* ]]; then nomModif+=_ ; fi # Vérifions si le nom n'est pas interdit.
if [[ "${#nomArgModif}" -ge 248 || "${#nomModif}" -ge 32384 ]] ; then # Vérifions si la longueur n'est pas excessive
LongPath=$((LongPath+1))
echo "chemin de fichier / dossier trop long ! $LongPath : $nomModif" >> /tmp/error.log
fi
if [[ "$nomOriginal" != "$nomModif" ]]; then # si il y a un changement a effectuer
if test -d "$nomOriginal" ; then # si c' est un dossier
NbRep+=1
if test -e "$nomModif" ; then # on verifie si il existe un dossier du meme nom avant de renommer
NbRepNOTModified+=1
echo "$NbRep un dossier du meme nom existe deja : $nomModif impossible de renommer $nomOriginal" >> /tmp/error.log
else # si pas de dossier du meme nom , on renomme
if [ "$modif_activ" = true ] ; then
mkdir -p "$nomModif"
echo "on va renommer le répertoire avec la commande suivante : mkdir $nomOriginal => $nomModif"
if test -e "$nomModif" ; then # si la creation du repertoire a reussi , on enregistre
echo "$NbScan CREER_REP : mkdir $nomModif" >> /tmp/modifs
NbRepModified+=1
else
NbRepNOTModified+=1
echo "$NbScan erreur inconnue pour repertoire : $nomOriginal" >> /tmp/error.log
fi
fi
fi
elif test -f "$nomOriginal" ; then # si c est un fichier
NbFile+=1
if test -e "$nomModif" ; then # on verifie si il existe un fichier du meme nom avant de renommer
NbFileNOTModified+=1
echo "$NbScan un fichier du meme nom existe deja : $nomModif impossible de renommer $nomOriginal" >> /tmp/error.log
else # si pas de fichier du meme nom , on renomme
pathOriginal=${nomOriginal%/*} # chemin du repertoire original
pathModif=${nomModif%/*} # chemin apres modif
if [[ "$pathOriginal" != "$pathModif" ]]; then # si les chemins sont differents , c' est que l' arborescence a été modifiée :
nomModif="$pathModif"/"$nomArgModif" # dans ce cas on utilise l' arborescence modifiée precedemment + le nom modifié du dernier argument pour la destination
fi
echo "renommage du fichier : mv $nomOriginal ==> $nomModif"
if [ "$modif_activ" = true ] ; then
mv "$nomOriginal" "$nomModif"
if test -e "$nomModif" ; then # on verifie que le fichier renommé existe bien , si le fichier existe on incremente et on enregistre
echo "$NbScan RENOM : mv $nomOriginal en : $nomModif" >> /tmp/modifs
NbFileModified+=1
else
NbFileNOTModified+=1
echo "$NbScan erreur inconnue pour fichier : $nomOriginal" >> /tmp/error.log
fi
fi
fi
else
NbFileModified+=1
echo "$NbScan erreur inconnue pour : $nomOriginal" >> /tmp/error.log
fi
fi
done
echo ""
echo "$NbScan répertoires et fichiers traités, $NbRepModified répertoires modifiés, $NbFileModified fichiers modifiés"
echo "$NbFileNOTModified fichiers , $NbRepNOTModified répertoires n ' ayant pas pu etre modifiés , le tout en $(($(date +%s)-Debut)) secondes."
echo ""
echo "liste des fichiers modifiés dans '/tmp/modifs'"
echo "liste des erreurs dans '/tmp/error.log'"
echo ""
(( LongPath )) && echo "vous avez $LongPath répertoires de taille trop importante. Voir le détail dans /tmp/error.log"
echo "pour supprimer les dossiers vides , copiez collez la commande suivante : find '${execDir:=$PWD}' -type d -empty -delete"Dernière modification par iznobe (Le 15/04/2026, à 10:45)
Hors ligne
#61 Le 14/04/2026, à 21:44
- Watael

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
(( LongPath )) && echo "vous avez $LongPath répertoires de taille trop importante. Voir le détail dans /tmp/error.log" ![]()
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#62 Le 15/04/2026, à 12:18
- iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
avec ce script :
#!/bin/bash
# Description des variables :
# $nomOriginal = nom complet rep ou fichier original
# $pathOriginal = chemin du repertoire original
# $nomModif = nom complet rep ou fichier modifié
# $pathModif = chemin du repertoire modifié
# $nomArgModif = nom dernier argument modifié
# variables a ajuster :
modif_activ=false # mettre : true pour appliquer les modifications , false pour visualiser les noms sans les modifier
all_spaces=true # mettre : true pour remplacer tous les espaces partout dans les noms de dossiers et de fichiers
execDir="" # Pour appliquer dans un dossier specifique , mettre le chemin absolu du dossier ici .
#### FIN ####
shopt -s globstar
### Liste des fichiers exclus
Exclus=(CON PRN aux NUL COM1 COM2 COM3 COM4 COM5 COM6 COM7 COM8 COM9 LPT1 LPT2 LPT3 LPT4 LPT5 LPT6 LPT7 LPT8 LPT9)
declare -i LongPath=0 NbScan=0 NbRep=0 NbFile=0 NbRepModified=0 NbFileModified=0 NbRepNOTModified=0 NbFileNOTModified=0; Debut=$(date +%s);
echo "liste des erreur ( fichiers ou dossiers ) n ' ayant pas pu etre modifiés :" > /tmp/error.log
echo "-------------------" > /tmp/modifs
for nomOriginal in "${execDir:=$PWD}/"**/*; do
NbScan+=1
# nomModif=$(echo $nomOriginal)
nomModif=$(echo $nomOriginal | sed 's@ */ *@/@g') # traitement des espaces en debut du nom
# remplacement d'un maxima de caractères interdits par windows : ><\:"|?* par " _ " + les espaces ( uniques et restant ) dans les noms .
if [ $all_spaces = true ]; then
nomModif=$(echo "$nomModif" | tr '><"|?*\\ :' '________%') # version all spaces .
else
nomModif=$(echo "$nomModif" | tr '><"|?*\\:' '_______%') # echappement de "\" par le meme signe donc 2 \\ pour qu un soit remplacé
fi
nomArgModif=$(echo "$nomModif" | grep -o '[^/]*$' ) # Récupére le dernier argument
if [[ " ${Exclus[*]} " == *" $nomArgModif "* ]]; then nomModif+=_ ; fi # Vérifions si le nom n'est pas interdit.
if [[ "${#nomArgModif}" -ge 248 || "${#nomModif}" -ge 32384 ]] ; then # Vérifions si la longueur n'est pas excessive
LongPath=$((LongPath+1))
echo "chemin de fichier / dossier trop long ! $LongPath : $nomModif" >> /tmp/error.log
fi
if [[ "$nomOriginal" != "$nomModif" ]]; then # si il y a un changement a effectuer
if test -d "$nomOriginal" ; then # si c' est un dossier
NbRep+=1
if test -e "$nomModif" ; then # on verifie si il existe un dossier du meme nom avant de renommer
NbRepNOTModified+=1
echo "$NbRep un dossier du meme nom existe deja : $nomModif impossible de renommer $nomOriginal" >> /tmp/error.log
else # si pas de dossier du meme nom , on renomme
if [ "$modif_activ" = true ] ; then
mkdir -p "$nomModif"
echo "on va renommer le répertoire avec la commande suivante : mkdir $nomOriginal => $nomModif"
if test -e "$nomModif" ; then # si la creation du repertoire a reussi , on enregistre
echo "$NbScan CREER_REP : mkdir $nomModif" >> /tmp/modifs
NbRepModified+=1
else
NbRepNOTModified+=1
echo "$NbScan erreur inconnue pour repertoire : $nomOriginal" >> /tmp/error.log
fi
fi
fi
elif test -f "$nomOriginal" ; then # si c est un fichier
NbFile+=1
if test -e "$nomModif" ; then # on verifie si il existe un fichier du meme nom avant de renommer
NbFileNOTModified+=1
echo "$NbScan un fichier du meme nom existe deja : $nomModif impossible de renommer $nomOriginal" >> /tmp/error.log
else # si pas de fichier du meme nom , on renomme
pathOriginal=${nomOriginal%/*} # chemin du repertoire original
pathModif=${nomModif%/*} # chemin apres modif
if [[ "$pathOriginal" != "$pathModif" ]]; then # si les chemins sont differents , c' est que l' arborescence a été modifiée :
nomModif="$pathModif"/"$nomArgModif" # dans ce cas on utilise l' arborescence modifiée precedemment + le nom modifié du dernier argument pour la destination
fi
echo "renommage du fichier : mv '$nomOriginal' ==> '$nomModif'"
if [ "$modif_activ" = true ] ; then
mv "$nomOriginal" "$nomModif"
if test -e "$nomModif" ; then # on verifie que le fichier renommé existe bien , si le fichier existe on incremente et on enregistre
echo "$NbScan RENOM : mv $nomOriginal en : $nomModif" >> /tmp/modifs
NbFileModified+=1
else
NbFileNOTModified+=1
echo "$NbScan erreur inconnue pour fichier : $nomOriginal" >> /tmp/error.log
fi
fi
fi
else
NbFileModified+=1
echo "$NbScan erreur inconnue pour : $nomOriginal" >> /tmp/error.log
fi
fi
done
echo ""
echo "$NbScan répertoires et fichiers traités, $NbRepModified répertoires modifiés, $NbFileModified fichiers modifiés"
echo "$NbFileNOTModified fichiers , $NbRepNOTModified répertoires n ' ayant pas pu etre modifiés , le tout en $(($(date +%s)-Debut)) secondes."
echo ""
echo "liste des fichiers modifiés dans '/tmp/modifs'"
echo "liste des erreurs dans '/tmp/error.log'"
echo ""
(( LongPath )) && echo "vous avez $LongPath répertoires de taille trop importante. Voir le détail dans /tmp/error.log"
echo "pour supprimer les dossiers vides , copiez collez la commande suivante : find '${execDir:=$PWD}' -type d -empty -delete"et :
iznobe@m-pi3:~/test $ ls -l
total 8
-rw-rw-r-- 1 iznobe iznobe 5 15 avril 11:43 '><"|?* \\ :'
-rw-rw-r-- 1 iznobe iznobe 0 15 avril 11:05 test%
-rw-rw-r-- 1 iznobe iznobe 10 15 avril 10:57 ' test: fichier de test % ? '
iznobe@m-pi3:~/test $j ' obtiens :
iznobe@m-pi3:~/test $ bash ~/rename.sh
renommage du fichier : mv /home/iznobe/test/><"|?* \\ : ==> '/home/iznobe/test/______ __ % __ % __ %'
renommage du fichier : mv /home/iznobe/test/ test: fichier de test % ? ==> '/home/iznobe/test/ test% fichier de test % _'
3 répertoires et fichiers traités, 0 répertoires modifiés, 0 fichiers modifiés
0 fichiers , 0 répertoires n ' ayant pas pu etre modifiés , le tout en 0 secondes.
liste des fichiers modifiés dans '/tmp/modifs'
liste des erreurs dans '/tmp/error.log'
pour supprimer les dossiers vides , copiez collez la commande suivante : find '/home/iznobe/test' -type d -empty -delete
iznobe@m-pi3:~/test $c ' est l ' espace dans le " tr " ( all_spaces ) qui met le bins ???? :
if [ $all_spaces = true ]; then
nomModif=$(echo "$nomModif" | tr '><"|?*\\ :' '________%') # version all spaces .Pourquoi est ce que je n' obtiens pas :
renommage du fichier : mv /home/iznobe/test/><"|?* \\ : ==> '/home/iznobe/test/__________%'???
la version " normale " parait fonctionner correctement .
EDIT , dans le terminal , pourtant :
mer. avril 15 13:15:32 iznobe@iznobe-pc:~$ nomModif='><"|?*\\ :'
mer. avril 15 13:15:49 iznobe@iznobe-pc:~$ nomModif=$(echo "$nomModif" | tr '><"|?*\\ :' '________%') # version all spaces .
mer. avril 15 13:15:59 iznobe@iznobe-pc:~$ echo $nomModif
_________%
mer. avril 15 13:16:07 iznobe@iznobe-pc:~$ Dernière modification par iznobe (Le 15/04/2026, à 13:16)
Hors ligne
#63 Le 15/04/2026, à 13:32
- iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
modification :
#!/bin/bash
# Description des variables :
# $nomOriginal = nom complet rep ou fichier original
# $pathOriginal = chemin du repertoire original
# $nomModif = nom complet rep ou fichier modifié
# $pathModif = chemin du repertoire modifié
# $nomArgModif = nom dernier argument modifié
# variables a ajuster :
modif_activ=false # mettre : true pour appliquer les modifications , false pour visualiser les noms sans les modifier
all_spaces=true # mettre : true pour remplacer tous les espaces partout dans les noms de dossiers et de fichiers
execDir="" # Pour appliquer dans un dossier specifique , mettre le chemin absolu du dossier ici .
#### FIN ####
shopt -s globstar
### Liste des fichiers exclus
Exclus=(CON PRN aux NUL COM1 COM2 COM3 COM4 COM5 COM6 COM7 COM8 COM9 LPT1 LPT2 LPT3 LPT4 LPT5 LPT6 LPT7 LPT8 LPT9)
declare -i LongPath=0 NbScan=0 NbRep=0 NbFile=0 NbRepModified=0 NbFileModified=0 NbRepNOTModified=0 NbFileNOTModified=0; Debut=$(date +%s);
echo "liste des erreur ( fichiers ou dossiers ) n ' ayant pas pu etre modifiés :" > /tmp/error.log
echo "-------------------" > /tmp/modifs
for nomOriginal in "${execDir:=$PWD}/"**/*; do
NbScan+=1
# nomModif=$(echo $nomOriginal)
nomModif=$(echo $nomOriginal | sed 's@ */ *@/@g') # traitement des espaces en debut du nom
#echo " nomModif apres traitement des espaces : '$nomModif'"
# remplacement d'un maxima de caractères interdits par windows : ><\:"|?* par " _ " + les espaces ( uniques et restant ) dans les noms .
if [ $all_spaces = true ]; then
nomModif=$(echo "$nomModif" | tr '><"|?*\\ :' '________%') # version all spaces .
else
nomModif=$(echo "$nomModif" | tr '><"|?*\\:' '_______%') # echappement de "\" par le meme signe donc 2 \\ pour qu un soit remplacé
fi
#echo " nomModif apres traitement des caracteres spéciaux : '$nomModif'"
nomArgModif=$(echo "$nomModif" | grep -o '[^/]*$' ) # Récupére le dernier argument
if [[ " ${Exclus[*]} " == *" $nomArgModif "* ]]; then nomModif+=_ ; fi # Vérifions si le nom n'est pas interdit.
if [[ "${#nomArgModif}" -ge 248 || "${#nomModif}" -ge 32384 ]] ; then # Vérifions si la longueur n'est pas excessive
LongPath=$((LongPath+1))
echo "chemin de fichier / dossier trop long ! $LongPath : $nomModif" >> /tmp/error.log
fi
if [[ "$nomOriginal" != "$nomModif" ]]; then # si il y a un changement a effectuer
if test -d "$nomOriginal" ; then # si c' est un dossier
NbRep+=1
if test -e "$nomModif" ; then # on verifie si il existe un dossier du meme nom avant de renommer
NbRepNOTModified+=1
echo "$NbRep un dossier du meme nom existe deja : $nomModif impossible de renommer $nomOriginal" >> /tmp/error.log
else # si pas de dossier du meme nom , on renomme
if [ "$modif_activ" = true ] ; then
mkdir -p "$nomModif"
echo "on va renommer le répertoire avec la commande suivante : mkdir $nomOriginal => $nomModif"
if test -e "$nomModif" ; then # si la creation du repertoire a reussi , on enregistre
echo "$NbScan CREER_REP : mkdir $nomModif" >> /tmp/modifs
NbRepModified+=1
else
NbRepNOTModified+=1
echo "$NbScan erreur inconnue pour repertoire : $nomOriginal" >> /tmp/error.log
fi
fi
fi
elif test -f "$nomOriginal" ; then # si c est un fichier
NbFile+=1
if test -e "$nomModif" ; then # on verifie si il existe un fichier du meme nom avant de renommer
NbFileNOTModified+=1
echo "$NbScan un fichier du meme nom existe deja : $nomModif impossible de renommer $nomOriginal" >> /tmp/error.log
else # si pas de fichier du meme nom , on renomme
pathOriginal=${nomOriginal%/*} # chemin du repertoire original
pathModif=${nomModif%/*} # chemin apres modif
if [[ "$pathOriginal" != "$pathModif" ]]; then # si les chemins sont differents , c' est que l' arborescence a été modifiée :
nomModif="$pathModif"/"$nomArgModif" # dans ce cas on utilise l' arborescence modifiée precedemment + le nom modifié du dernier argument pour la destination
fi
echo "renommage du fichier : mv '$nomOriginal' ==> '$nomModif'"
if [ "$modif_activ" = true ] ; then
mv "$nomOriginal" "$nomModif"
if test -e "$nomModif" ; then # on verifie que le fichier renommé existe bien , si le fichier existe on incremente et on enregistre
echo "$NbScan RENOM : mv $nomOriginal en : $nomModif" >> /tmp/modifs
NbFileModified+=1
else
NbFileNOTModified+=1
echo "$NbScan erreur inconnue pour fichier : $nomOriginal" >> /tmp/error.log
fi
fi
fi
else
NbFileModified+=1
echo "$NbScan erreur inconnue pour : $nomOriginal" >> /tmp/error.log
fi
fi
done
echo ""
echo "$NbScan répertoires et fichiers traités, $NbRepModified répertoires modifiés, $NbFileModified fichiers modifiés"
echo "$NbFileNOTModified fichiers , $NbRepNOTModified répertoires n ' ayant pas pu etre modifiés , le tout en $(($(date +%s)-Debut)) secondes."
echo ""
echo "liste des fichiers modifiés dans '/tmp/modifs'"
echo "liste des erreurs dans '/tmp/error.log'"
echo ""
(( LongPath )) && echo "vous avez $LongPath répertoires de taille trop importante. Voir le détail dans /tmp/error.log"
echo "pour supprimer les dossiers vides , copiez collez la commande suivante : find '${execDir:=$PWD}' -type d -empty -delete"Hors ligne
#64 Le 15/04/2026, à 15:10
- Watael

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
salut,
30 if [ $all_spaces = true ]plus tard, au moins une autre variable binaire est entre guillemets.
quand j'ai des variables binaires (vrai/faux), je les déclare entier et valent respectivement 1/0
((0)); echo $?
1 #donc faux
((1)); echo $?
0 #donc vrai![]()
37 nomArgModif=$(echo "$nomModif" | grep -o '[^/]*$' ) # Récupére le dernier argumenttu ne veux pas t'essayer au BASH_REMATCH ?
40 if [[ "${#nomArgModif}" -ge 248 || "${#nomModif}" -ge 32384 ]] ; then # Vérifions si la longueurtu ne veux pas utiliser l'évaluation arithmétique ?
41 ((LongPath+=1)) ?
plus tard, tu fais (puisque la variable est déclarée entier) var+=1; pourquoi pas là ?
![]()
Dernière modification par Watael (Le 15/04/2026, à 15:11)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#65 Le 15/04/2026, à 18:10
- iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
quand j'ai des variables binaires (vrai/faux), je les déclare entier et valent respectivement 1/0
((0)); echo $? 1 #donc faux ((1)); echo $? 0 #donc vrai
c' est contre intuitif ( par rapport aux autres langages ) , c ' est pour ça que je préfère éviter ce genre de chose , c ' est juste bon pour s ' emmêler les pinceaux ...
avec :
if [ $all_spaces = true ] tu ne peux pas te tromper , soit c' est vrai , soit non
. surtout quand tu reviens dans le code comme là , par exemple un an ou 2 après ...
Pour le reste je vais modifier.
Pour BASH REMATCH , ca impose de passer par une évaluation regex , ce qui doit être plus long en terme de traitement non ?
Merci pour ta relecture ![]()
Dernière modification par iznobe (Le 15/04/2026, à 18:14)
Hors ligne
#66 Le 15/04/2026, à 18:19
- Watael

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
le binaire ne dépend d'aucun langage
[...] la valeur VRAI correspond au 1 logique et [...] FAUX est synonyme du 0 logique.
les codes de retour, eux, ne sont pas binaires.
binVal=0
if ((binVal)); then echo vrai; else echo faux; fi
faux #c'est vrai : binVal vaut zéro, donc faux.
mon souci avec le test n'est pas qu'il n'y a pas de guillemets, c'est que ailleurs dans le code il y en a; c'est un "problème" de cohérence. ![]()
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#67 Le 15/04/2026, à 18:27
- iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
c'est un "problème" de cohérence
j ' ai " coherer " le tout ![]()
Sinon , pour ça : https://forum.ubuntu-fr.org/viewtopic.p … #p22891310
Oui, je voudrais pouvoir supprimer l'espace final " avant le .ext " sans remplacer les autres si possible :
Que "xxx xxx .odt" devienne "xxx xxx.odt" ou à la rigueur "xxx xxx_.odt"
.odt n ' est qu ' un example .
c' est faisable pour toutes extensions non définies d ' ajouter au script ?
Parceque perso , je ne vois pas comment gérer ça ...
Dernière modification par iznobe (Le 15/04/2026, à 18:34)
Hors ligne
#68 Le 15/04/2026, à 18:48
- Watael

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
je ne vois pas de difficulté : l'extension (ce qui est après le dernier point*) est sauvegardée, si le nom du fichier (sans extension) finit par un ou des espaces, alors tu les supprime, et tu "recolles" l'extension.
j'ai râté quelque chose ?
--
* il peut y avoir des faux positifs : spécialiste auto-certifié en nom de fichiers pourris, j'ai des fichiers pour lesquels ce qui est après le dernier point ne désigne pas le format interne du fichier. ![]()
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#69 Le 15/04/2026, à 19:09
- iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
ce qui est après le dernier point ne désigne pas le format interne du fichier.
il y en a plein sur linux : sources.list etc ...
je vais essayer de voir ça en tout cas .
je poste les dernières modifs :
#!/bin/bash
# Description des variables :
# $nomOriginal = nom complet rep ou fichier original
# $pathOriginal = chemin du repertoire original
# $nomModif = nom complet rep ou fichier modifié
# $pathModif = chemin du repertoire modifié
# $nomArgModif = nom dernier argument modifié
# variables a ajuster :
modif_activ=false # mettre : true pour appliquer les modifications , false pour visualiser les noms sans les modifier
all_spaces=false # mettre : true pour remplacer tous les espaces partout dans les noms de dossiers et de fichiers
execDir="" # Pour appliquer dans un dossier specifique , mettre le chemin absolu du dossier ici .
#### FIN ####
shopt -s globstar
### Liste des fichiers exclus
Exclus=(CON PRN aux NUL COM1 COM2 COM3 COM4 COM5 COM6 COM7 COM8 COM9 LPT1 LPT2 LPT3 LPT4 LPT5 LPT6 LPT7 LPT8 LPT9)
declare -i LongPath=0 NbScan=0 NbRep=0 NbFile=0 NbRepModified=0 NbFileModified=0 NbRepNOTModified=0 NbFileNOTModified=0; Debut=$(date +%s);
echo "liste des erreur ( fichiers ou dossiers ) n ' ayant pas pu etre modifiés :" > /tmp/error.log
echo "-------------------" > /tmp/modifs
for nomOriginal in "${execDir:=$PWD}/"**/*; do
NbScan+=1
nomModif=$(echo $nomOriginal | sed 's@ */ *@/@g') # traitement des espaces en debut et fin du nom et les espaces consécutifs au mileiu du nom sont raamenés a un seul espace
#echo " nomModif apres traitement des espaces : '$nomModif'"
# remplacement d'un maxima de caractères interdits par windows : ><\:"|?* par " _ " + les espaces ( uniques et restant ) dans les noms .
if [ $all_spaces = true ]; then
nomModif=$(echo "$nomModif" | tr '><"|?*\\ :' '________%') # version all spaces .
else
nomModif=$(echo "$nomModif" | tr '><"|?*\\:' '_______%') # echappement de "\" par le meme signe donc 2 \\ pour qu un soit remplacé
fi
#echo " nomModif apres traitement des caracteres spéciaux : '$nomModif'"
nomArgModif=$(echo "$nomModif" | grep -o '[^/]*$' ) # Récupére le dernier argument
if [[ " ${Exclus[*]} " == *" $nomArgModif "* ]]; then nomModif+=_ ; fi # Vérifions si le nom n'est pas interdit.
if (( "${#nomArgModif}" >= 248 || "${#nomModif}" >= 32384 )) ; then # Vérifions si la longueur n'est pas excessive
LongPath+=1
echo "chemin de fichier ou de dossier trop long ! $LongPath : $nomModif" >> /tmp/error.log
fi
if [[ "$nomOriginal" != "$nomModif" ]]; then # si il y a un changement a effectuer
if test -d "$nomOriginal" ; then # si c' est un dossier
NbRep+=1
if test -e "$nomModif" ; then # on verifie si il existe un dossier du meme nom avant de renommer
NbRepNOTModified+=1
echo "$NbRep un dossier du meme nom existe deja : $nomModif impossible de renommer $nomOriginal" >> /tmp/error.log
else # si pas de dossier du meme nom , on renomme
if [ $modif_activ = true ] ; then
mkdir -p "$nomModif"
echo "on va renommer le répertoire avec la commande suivante : mkdir $nomOriginal => $nomModif"
if test -e "$nomModif" ; then # si la creation du repertoire a reussi , on enregistre
echo "$NbScan CREER_REP : mkdir $nomModif" >> /tmp/modifs
NbRepModified+=1
else
NbRepNOTModified+=1
echo "$NbScan erreur inconnue pour repertoire : $nomOriginal" >> /tmp/error.log
fi
fi
fi
elif test -f "$nomOriginal" ; then # si c est un fichier
NbFile+=1
if test -e "$nomModif" ; then # on verifie si il existe un fichier du meme nom avant de renommer
NbFileNOTModified+=1
echo "$NbScan un fichier du meme nom existe deja : $nomModif impossible de renommer $nomOriginal" >> /tmp/error.log
else # si pas de fichier du meme nom , on renomme
pathOriginal=${nomOriginal%/*} # chemin du repertoire original
pathModif=${nomModif%/*} # chemin apres modif
if [[ "$pathOriginal" != "$pathModif" ]]; then # si les chemins sont differents , c' est que l' arborescence a été modifiée :
nomModif="$pathModif"/"$nomArgModif" # dans ce cas on utilise l' arborescence modifiée precedemment + le nom modifié du dernier argument pour la destination
fi
echo "renommage du fichier : mv '$nomOriginal' ==> '$nomModif'"
if [ $modif_activ = true ] ; then
mv "$nomOriginal" "$nomModif"
if test -e "$nomModif" ; then # on verifie que le fichier renommé existe bien , si le fichier existe on incremente et on enregistre
echo "$NbScan RENOM : mv $nomOriginal en : $nomModif" >> /tmp/modifs
NbFileModified+=1
else
NbFileNOTModified+=1
echo "$NbScan erreur inconnue pour fichier : $nomOriginal" >> /tmp/error.log
fi
fi
fi
else
NbFileModified+=1
echo "$NbScan erreur inconnue pour : $nomOriginal" >> /tmp/error.log
fi
fi
done
echo ""
echo "$NbScan répertoires et fichiers traités, $NbRepModified répertoires modifiés, $NbFileModified fichiers modifiés"
echo "$NbFileNOTModified fichiers , $NbRepNOTModified répertoires n ' ayant pas pu etre modifiés , le tout en $(($(date +%s)-Debut)) secondes."
echo ""
echo "liste des fichiers modifiés dans '/tmp/modifs'"
echo "liste des erreurs dans '/tmp/error.log'"
echo ""
(( LongPath )) && echo "vous avez $LongPath répertoires de taille trop importante. Voir le détail dans /tmp/error.log"
echo "pour supprimer les dossiers vides , copiez collez la commande suivante : find '${execDir:=$PWD}' -type d -empty -delete"Avant d' attaquer pour les " extensions " .
Dernière modification par iznobe (Le 15/04/2026, à 19:15)
Hors ligne
#70 Le 15/04/2026, à 19:21
- Watael

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
bof, les .list ont un format interne, et l'extension le dit clairement.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#71 Le 15/04/2026, à 19:53
- iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
j ' ai trouvé ça sinon :
sanitize() {
shopt -s extglob;
filename=$(basename "$1")
directory=$(dirname "$1")
filename_clean=$(echo "$filename" | sed -e 's/[\\/:\*\?"<>\|\x01-\x1F\x7F]//g' -e 's/^\(nul\|prn\|con\|lpt[0-9]\|com[0-9]\|aux\)\(\.\|$\)//i' -e 's/^\.*$//' -e 's/^$/NONAME/')
if (test "$filename" != "$filename_clean")
then
echo " => $1 serait renommé en $directory/$filename_clean"
#mv -v "$1" "$directory/$filename_clean"
fi
}
export -f sanitize
sanitize_dir() {
find "$1" -depth -exec bash -c 'sanitize "$0"' {} \;
}
sanitize_dir '/home/iznobe/Scripts/test'Mais y a un hic :
mer. avril 15 19:41:02 iznobe@iznobe-pc:~/Scripts/execution$ bash sanitize.sh
=> /home/iznobe/Scripts/test/COM6 serait renommé en /home/iznobe/Scripts/test/NONAME
=> /home/iznobe/Scripts/test/ test : .ino serait renommé en /home/iznobe/Scripts/test/ test .ino
=> /home/iznobe/Scripts/test/><"|?*\ : serait renommé en /home/iznobe/Scripts/test/
mer. avril 15 19:53:32 iznobe@iznobe-pc:~/Scripts/execution$ puisque :
mer. avril 15 20:28:09 iznobe@iznobe-pc:~/Scripts/execution$ ls -l ~/Scripts/test
total 8
-rw-rw-r-- 1 iznobe iznobe 6 avril 15 13:23 '><"|?*\ :'
-rw-r----- 1 iznobe iznobe 15 juin 24 2023 ' bash.sh '
-rw-r----- 1 iznobe iznobe 0 oct. 26 2022 COM6
-rw-r----- 1 iznobe iznobe 0 oct. 26 2022 ' test : .ino '
mer. avril 15 20:28:31 iznobe@iznobe-pc:~/Scripts/execution$ Apres avoir corrigé le HIc , il n ' y a plus qu' a :
je ne vois pas de difficulté : l'extension (ce qui est après le dernier point*) est sauvegardée, si le nom du fichier (sans extension) finit par un ou des espaces, alors tu les supprime, et tu "recolles" l'extension.
Ca te tente
?
Dernière modification par iznobe (Le 15/04/2026, à 20:29)
Hors ligne
#72 Le 15/04/2026, à 20:56
- iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
sinon , je sais pas trop pourquoi , mais j' ai un soucis pour récupérer l ' extension des fichiers dans le cas où ceux-ci n ' ont pas de " ." , j ' obtiens par exemple :
ext = ><"|?*\ :
ext = COM6
etc ...
if test -f "$nomOriginal"; then
pathOriginal=${nomOriginal%/*} # like dirname
file=${nomOriginal##*/} # like basename
ext=${file#*.} # get extension without filename
base=${file%%.*} # get filename without extension
#nomOriginalSansExt=${nomOriginal%%.*}
echo "pathOriginal=$pathOriginal"
echo "file=$file"
echo "ext = $ext"
echo "base = $base"
#echo "nomOriginalSansExt = $nomOriginalSansExt"
continue
firésultat identique avec :
awk_ext=$(echo "$file"|awk -F . '{print $NF}')je vais tout de même pas faire une regex pour ça ???
Dernière modification par iznobe (Le 15/04/2026, à 21:22)
Hors ligne
#73 Le 15/04/2026, à 21:52
- Watael

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
#!/bin/bash
monFic=~/BLA\ \ bla\ \ \ .EXT
ext=${monFic##*.}
nom=${monFic%.*}
echo ">$nom<"
shopt -s extglob
echo "${nom/%+( )}.$ext"$ ./monScript
>/home/watael/BLA bla <
/home/watael/BLA bla.EXT?
les espaces "à l'intérieur" sont préservés pour une substition ultérieure.
Dernière modification par Watael (Le 15/04/2026, à 21:54)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#74 Le 15/04/2026, à 22:02
- iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
sauf que le probleme est là :
#!/bin/bash
monFic=~/BLA\ \ bla\ \ \ # PAS DE .EXTdonc , je teste si c ' est un fichier , et si il ne contient pas de " . " ext devrait etre null .
pas me renvoyer le nom du fichier ...
Donc faut que je fasse une regex pour voir si le nom entier contient bien un point ou pas ?
A moins qu ' il y ait un autre moyen ?
mon fichier se nomme : "COM6" , quelle est son extension ?
Dernière modification par iznobe (Le 15/04/2026, à 22:07)
Hors ligne
#75 Le 15/04/2026, à 22:16
- Watael

Re : [RESOLU] script mettre en conformité les noms de fichiers samba
ouille!
#!/bin/bash
monFic=~/BLA\ \ bla\ \ \ #.ext
ext=${monFic##*.}
nom=${monFic%.*}
echo nom = "\"$nom\""
echo ext = $ext
test "$ext" = "$nom" && unset ext
shopt -s extglob
echo "nom= \"${nom/%+( )}${ext:+".$ext"}\""$ ./monScript
nom = "/home/watael/BLA bla "
ext = /home/watael/BLA bla
nom= "/home/watael/BLA bla"ok?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne