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.

#76 Le 15/04/2026, à 22:19

iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

ext = /home/watael/BLA bla

c' est ce que j' obtiens peu importe la façon que je m' y prends , tant que je ne fais pas une regex pour verifier si le filename contient bien un point ou pas.

je ne vais pas tester si des espaces sont en fin de filename ( sans extension ) , puisque ça fait déjà le taf .
dans le cas où il n ' y a pas de point dans le filename , je " continue " au sein de la boucle non ?

mais , ce que je veut dire c ' est que si il n ' y a pas d' extension , obligatoirement , il faut que :

if test -z $ext ; then continue

et que si

ext = BLA bla

ba forcément ça ne le fera pas.

Enfin , c ' est peut etre moi qui me plante sur la façon de voir la chose et qu il y a une meilleure approche .


En tout cas , sans tester l ' existence d ' un point , je ne vois pas comment mettre :

ext=""
if test -z $ext ; then continue
else
  traiter les espaces en fin de nom sans extensions 
...

rabouter l ' extension après traitement au nom de fichier sans extension pour retrouver le nom de fichier complet

Dernière modification par iznobe (Le 15/04/2026, à 22:27)

Hors ligne

#77 Le 15/04/2026, à 22:31

Watael

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

comme je l'ai montré dans mon message précédent (#75), si ext == nom, alors on supprime ext
enfin, si ext existe, alors on lui ajoute un point au début.


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

En ligne

#78 Le 15/04/2026, à 22:32

iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

c' est ce que je pensais , avant de faire une regex , mais bon c ' est pas trop folichon ça .

Si j' ai un fichier bash.bash , un list.list , un sources.sources , un conf.conf  ??

Dernière modification par iznobe (Le 15/04/2026, à 22:33)

Hors ligne

#79 Le 15/04/2026, à 22:39

Watael

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

l'extension ne sera pas égal à /chemin/nomSansExtension


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

En ligne

#80 Le 15/04/2026, à 22:58

iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

for nomOriginal in "${execDir:=$PWD}/"**/*; do
    NbScan+=1
    if test -f "$nomOriginal"; then
        ext=${nomOriginal##*.} # get extension without filename
        if test "$nomOriginal" = "$ext"; then
            continue
        else
            echo "traitement des espaces"
        fi
    fi
...

ça le fait .

je sais pas trop où j ' étais parti là ! hmm

Dernière modification par iznobe (Le 15/04/2026, à 22:58)

Hors ligne

#81 Le 15/04/2026, à 23:08

iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

bon pour ce soir , je m' arrête là :

for nomOriginal in "${execDir:=$PWD}/"**/*; do
    NbScan+=1
    if test -f "$nomOriginal"; then
        ext=${nomOriginal##*.} # get extension without filename
        if test "$nomOriginal" != "$ext"; then
            baseName=${nomOriginal%%.*} # get filename without extension
            baseName=$(echo $baseName | sed 's@ */ *@/@g') # traitement des espaces
            nomModif=$baseName+$ext
        fi
    fi
    nomModif=$(echo $nomOriginal | sed 's@ */ *@/@g') # traitement des espaces en debut et fin du nom et les espaces consécutifs au milieu du nom sont ramenés a un seul espace
...
    

Mais ça ne fonctionne pas comme attendu :

mer. avril 15 23:09:11 iznobe@iznobe-pc:~/Scripts/test$ bash ~/Scripts/rename.sh
renommage du fichier : mv '/home/iznobe/Scripts/test/><"|?*\ :' ==> '/home/iznobe/Scripts/test/_______ %'
renommage du fichier : mv '/home/iznobe/Scripts/test/ bash.sh ' ==> '/home/iznobe/Scripts/test/bash.sh'
renommage du fichier : mv '/home/iznobe/Scripts/test/COM6' ==> '/home/iznobe/Scripts/test/COM6_'
renommage du fichier : mv '/home/iznobe/Scripts/test/   test :   .ino   ' ==> '/home/iznobe/Scripts/test/test % .ino'

je devrais obtenir :

==> '/home/iznobe/Scripts/test/test %.ino'

Dernière modification par iznobe (Le 16/04/2026, à 00:04)

Hors ligne

#82 Le 16/04/2026, à 00:04

iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

Bon , finalement :

#!/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
    # permet de supprimer les espaces avant l' extension de fichier
    if test -f "$nomOriginal"; then
        ext=${nomOriginal##*.} # get extension without filename
        #baseName=${nomOriginal%%.*} # get filename without extension
        #echo "nomOriginal= '$nomOriginal' , EXT= '$ext' , baseName= '$baseName'"
        if test "$nomOriginal" != "$ext"; then
            baseName=${nomOriginal%%.*} # get filename without extension
            baseName=$(echo $baseName | sed 's@ */ *@/@g') # traitement des espaces
            baseName=$baseName.$ext
        else
            baseName=$nomOriginal
        fi
    fi

    nomModif=$(echo $baseName | sed 's@ */ *@/@g') # traitement des espaces en debut et fin du nom et les espaces consécutifs au milieu du nom sont ramené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 "$NbRep dossiers et $NbFile 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 dossiers et 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"

Mais ça ne fonctionne toujours pas au poil pour les extensions hmm
En particulier lorsqu ' il y a plusieurs points dans le nom du fichier !

Dernière modification par iznobe (Le 16/04/2026, à 09:12)

Hors ligne

#83 Le 16/04/2026, à 03:03

MicP

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

Bonjour

Mes petits bricolages, au cas où smile

mic@deb13x:~$ nomExt='bla bla  bloblo aucune extension'
mic@deb13x:~$ 
mic@deb13x:~$ nom="${nomExt%.*}"
mic@deb13x:~$ [ "$nom" != "$nomExt" ] && ext="${nomExt##*.}" || echo "Pas de nom d'extension"
Pas de nom d'extension
mic@deb13x:~$ 
mic@deb13x:~$ echo "'$nom'"  "'$ext'"
'bla bla  bloblo aucune extension' ''
mic@deb13x:~$ 
mic@deb13x:~$ 
mic@deb13x:~$ nomExt='bla .bla  bloblo .avec une .extension'
mic@deb13x:~$ 
mic@deb13x:~$ nom="${nomExt%.*}"
mic@deb13x:~$ [ "$nom" != "$nomExt" ] && ext="${nomExt##*.}" || echo "Pas de nom d'extension"
mic@deb13x:~$ 
mic@deb13x:~$ echo "'$nom'"  "'$ext'"
'bla .bla  bloblo .avec une ' 'extension'
mic@deb13x:~$ 

Hors ligne

#84 Le 16/04/2026, à 10:05

iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

Bonjour @MicP et merci , en fait , grace a toi , je me suis rendu compte que le découpage était mal réalisé dans mon script ...
au lieu de :

baseName="${nomOriginal%%.*}" # get filename without extension

il faut mettre :

baseName="${nomOriginal%.*}" # get filename without extension

un bug de moins .

Par contre , il me reste encore un truc qui ne va pas dans le " tr " encore roll :

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 % _'
renommage du fichier : mv '/home/iznobe/test/   test :   .ino   ' ==> '/home/iznobe/test/test %.ino'

Pour le fichier nommé  '><"|?* \\ :' , je comprends pas pourquoi j ' obtiens :

mv '/home/iznobe/test/><"|?* \\ :' ==> '/home/iznobe/test/______ __ % __ %'

Hors ligne

#85 Le 16/04/2026, à 10:56

iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

Finalement , après moult tests , le problème n ' est pas la commande tr , le problème vient de :

baseName="$(echo $baseName | sed 's@ */ *@/@g')" # traitement des espaces

en combinaison avec le caractère " * " dans le nom d' un fichier ...

iznobe@m-pi3:~/test $ bash  ~/rename.sh
renommage du fichier : mv '/home/iznobe/test/*' ==> '/home/iznobe/test/_/home/iznobe/test/______ __ %/home/iznobe/test/_______ %/home/iznobe/test/COM6/home/iznobe/test/@pour , ù_ @/home/iznobe/test/@pour , ù_ @ _/home/iznobe/test/@pour , ù_ @ _ __/home/iznobe/test/@pour , ù_ @ __/home/iznobe/test/@pour , ù_ @ _ __ jk/home/iznobe/test/test%/home/iznobe/test/test%   fichier de test    % _/home/iznobe/test/test %   .ino   '
renommage du fichier : mv '/home/iznobe/test/><"|?* \\ :' ==> '/home/iznobe/test/______ __ %/home/iznobe/test/_______ % __ %'
renommage du fichier : mv '/home/iznobe/test/><"|?*\ :' ==> '/home/iznobe/test/_______ %'
renommage du fichier : mv '/home/iznobe/test/COM6' ==> '/home/iznobe/test/COM6_'
renommage du fichier : mv '/home/iznobe/test/  @pour , ù? @   ' ==> '/home/iznobe/test/@pour , ù_ @'
renommage du fichier : mv '/home/iznobe/test/  @pour , ù? @ *' ==> '/home/iznobe/test/@pour , ù_ @ _ ______ __ % _______ % COM6   @pour , ù_ @      @pour , ù_ @ _   @pour , ù_ @ _ __   @pour , ù_ @ __     @pour , ù_ @ _ __ jk   test%    test%   fichier de test    % _       test %   .ino   '
renommage du fichier : mv '/home/iznobe/test/  @pour , ù? @ * \\' ==> '/home/iznobe/test/@pour , ù_ @ _ ______ __ % _______ % COM6   @pour , ù_ @      @pour , ù_ @ _   @pour , ù_ @ _ __   @pour , ù_ @ __     @pour , ù_ @ _ __ jk   test%    test%   fichier de test    % _       test %   .ino    __'
renommage du fichier : mv '/home/iznobe/test/  @pour , ù? @ \\  ' ==> '/home/iznobe/test/@pour , ù_ @ __'
renommage du fichier : mv '/home/iznobe/test/  @pour , ù? @ * \\ jk  ' ==> '/home/iznobe/test/@pour , ù_ @ _ ______ __ % _______ % COM6   @pour , ù_ @      @pour , ù_ @ _   @pour , ù_ @ _ __   @pour , ù_ @ __     @pour , ù_ @ _ __ jk   test%    test%   fichier de test    % _       test %   .ino    __ jk'
renommage du fichier : mv '/home/iznobe/test/   test:   fichier de test    % ?   ' ==> '/home/iznobe/test/test% fichier de test % _'
renommage du fichier : mv '/home/iznobe/test/   test :   .ino   ' ==> '/home/iznobe/test/test %.ino'

0 dossiers et 11 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 dossiers et 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 $

Dernière modification par iznobe (Le 16/04/2026, à 11:09)

Hors ligne

#86 Le 16/04/2026, à 13:36

iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

Allez , cette fois c ' est la bonne ( j ' espere big_smile )  :

#!/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é
# baseName = chemin du fichier sans .ext
# $ext = extension du fichier le cas échéant sinon , renvoie le chemin complet du fichier.

# 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 NbRepScanned=0 NbFileScanned=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
    # permet de supprimer les espaces avant l' extension de fichier :
    if test -f "$nomOriginal"; then
        NbFileScanned+=1
        ext="${nomOriginal##*.}" # get extension without filename
        #baseName=${nomOriginal%%.*} # get filename without extension
        #echo "nomOriginal= '$nomOriginal' , EXT= '$ext' , baseName= '$baseName'"
        if test "$nomOriginal" != "$ext"; then
            baseName="${nomOriginal%.*}" # get filename without extension
            baseName="$(echo $baseName | awk '{gsub(/\s+\/\s+/, "/"); gsub(/\/\s+/, "/"); gsub(/\s+\//, "/"); gsub(/ +/, " "); print}')" # traitement des espaces
            baseName="$baseName.$ext"
        fi
    else
        NbRepScanned+=1
        baseName="$nomOriginal"
    fi

    nomModif="$(echo $baseName | awk '{gsub(/\s+\/\s+/, "/"); gsub(/\/\s+/, "/"); gsub(/\s+\//, "/"); gsub(/ +/, " "); print}')" # traitement des espaces en debut et fin du nom et les espaces consécutifs au milieu du nom sont ramené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
            if test -e "$nomModif" ; then # on verifie si il existe un dossier du meme nom avant de renommer
                NbRepNOTModified+=1
                echo "$NbRepScanned 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 le dossier : $nomOriginal" >> /tmp/error.log
                    fi
                fi
            fi
        elif test -f "$nomOriginal" ; then # si c est un fichier
            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
            echo "$NbScan erreur inconnue pour : $nomOriginal" >> /tmp/error.log
        fi
    fi
done

echo ""
echo "$NbRepScanned dossiers et $NbFileScanned 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 dossiers et 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"

ce qui donne :

jeu. avril 16 13:36:41 iznobe@iznobe-pc:~/Scripts/test$ bash ~/Scripts/rename.sh
renommage du fichier : mv '/home/iznobe/Scripts/test/><"|?*\ :' ==> '/home/iznobe/Scripts/test/_______ %'
renommage du fichier : mv '/home/iznobe/Scripts/test/ bash.sh ' ==> '/home/iznobe/Scripts/test/bash.sh'
renommage du fichier : mv '/home/iznobe/Scripts/test/COM6' ==> '/home/iznobe/Scripts/test/COM6_'
renommage du fichier : mv '/home/iznobe/Scripts/test/   test :   .ino   ' ==> '/home/iznobe/Scripts/test/test %.ino'

et pour la version " all_spaces " :

jeu. avril 16 13:42:54 iznobe@iznobe-pc:~/Scripts/test$ bash ~/Scripts/rename.sh
renommage du fichier : mv '/home/iznobe/Scripts/test/><"|?*\ :' ==> '/home/iznobe/Scripts/test/________%'
renommage du fichier : mv '/home/iznobe/Scripts/test/ bash.sh ' ==> '/home/iznobe/Scripts/test/bash.sh'
renommage du fichier : mv '/home/iznobe/Scripts/test/COM6' ==> '/home/iznobe/Scripts/test/COM6_'
renommage du fichier : mv '/home/iznobe/Scripts/test/   test :   .ino   ' ==> '/home/iznobe/Scripts/test/test_%.ino'

ce qui me semble correct.

Dernière modification par iznobe (Le 16/04/2026, à 20:11)

Hors ligne

#87 Le 16/04/2026, à 14:47

Watael

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

tu sais que les guillemets autour des Substitutions de commandes dans une assignation sont trèèès facultatifs ?
autour des Remplacements de paramètres aussi, d'ailleurs, si il n'y a pas d'espaces qui séparent leur concaténation.

Allez , cette fois c ' est la bonne ( j ' espere :D )  :

ne ferme quand même pas ton éditeur. lol


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

En ligne

#88 Le 16/04/2026, à 15:56

iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

Je pensais que tu allais faire une remarque , soit sur le awk , soit sur la structure générale du déroulement du script ( qui n' est pas optimale a priori , puisqu ' on y trouve 2 test pour savoir si c ' est un fichier ou un dossier ) , mais non , surprise .

Sinon , j ' ai " coherer " partout où j ' ai pu big_smile

Dernière modification par iznobe (Le 16/04/2026, à 15:57)

Hors ligne

#89 Le 16/04/2026, à 16:30

Watael

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

Watael a écrit :
Allez , cette fois c ' est la bonne ( j ' espere :D )  :

ne ferme quand même pas ton éditeur. lol

je n'ai pas encore tout lu. wink


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

En ligne

#90 Le 16/04/2026, à 17:02

iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

Il va falloir modifier , il y a encore un truc qui cloche , il me dit toujours dans le récapitulatif :

xxx répertoires n ' ayant pas pu etre modifiés

Alors que il ne devrait modifier aucun dossier ...

Sinon j ' ai modifié déjà quelques autres bricoles , le nom des variables pour le récapitulatif principalement .

je réfléchis justement pour le déroulement global du script , mais je crois que j' ai besoin d' un peu de repos avant big_smile

Dernière modification par iznobe (Le 16/04/2026, à 17:04)

Hors ligne

#91 Le 16/04/2026, à 23:18

Watael

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

21 Exclus=( CON PRN aux NUL COM{1..9} LPT{1..9} )
26 for nomOriginal in "${execDir:=$PWD}/"**/*; do

à cause de ~/, j'ai pris l'habitude de ne pas mettre les / dans les guillemets près d'un développement de chemin.

encore un peu d'harmonisation ,

29     if test -f "$nomOriginal"
47     if [ "$all_spaces" = true ];

pareil lignes 63 et 68, puis d'autres

ligne 36, le awk me paraît difficilement "bashable", par contre tu peux te passer du echo

awk -v bN="$baseName" 'BEGIN{$0=bN; gsub(/\s+\/\s+/, "/"); gsub(/\/\s+/, "/"); gsub(/\s+\//, "/"); gsub(/ +/, " "); print}'

si les eux awk font exactement la même chose, il faut en faire une fonction.

pour les répertoires qui ne peuvent pas être modifiés, il faut peut-être distinguer la raison de l'impossibilité : la modif a échoué ou le répertoire existe déjà


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

En ligne

#92 Le 17/04/2026, à 00:32

iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

Simplification du code , corrections de bugs du récapitulatif , intégration quelques remarques:

#!/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é
# baseName = chemin du fichier sans .ext
# $ext = extension du fichier le cas échéant sinon , renvoie le chemin complet du fichier.

# 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 COM{1..9} LPT{1..9} )
declare -i LongPath=0 NbRepScanned=0 NbFileScanned=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
    # permet de supprimer les espaces avant l' extension de fichier :
    if test -f "$nomOriginal"; then
        NbFileScanned+=1
        ext="${nomOriginal##*.}" # get extension without filename
        if test "$nomOriginal" != "$ext"; then
            baseName="${nomOriginal%.*}" # get filename without extension
            baseName="$(echo $baseName | awk '{gsub(/\s+\/\s+/, "/"); gsub(/\/\s+/, "/"); gsub(/\s+\//, "/"); gsub(/ +/, " "); print}')" # traitement des espaces
            baseName="$baseName.$ext"
        else
            baseName="$nomOriginal"
        fi
    else
        NbRepScanned+=1
        baseName="$nomOriginal"
    fi

    nomModif="$(echo $baseName | awk '{gsub(/\s+\/\s+/, "/"); gsub(/\/\s+/, "/"); gsub(/\s+\//, "/"); gsub(/ +/, " "); print}')" # traitement des espaces en debut et fin du nom et les espaces consécutifs au milieu du nom sont ramené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 test "$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
            if test -e "$nomModif" ; then # on verifie si il existe un dossier du meme nom avant de renommer
                NbRepNOTModified+=1
                echo "$NbRepNOTModified 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 test "$modif_activ" = true; then
                    mkdir -p "$nomModif"
                    echo "on va renommer le répertoire avec la commande suivante : mkdir $nomOriginal => $nomModif"
                    NbRepModified+=1
                    echo "$NbRepModified CREER_REP : mkdir $nomModif" >> /tmp/modifs
                fi
            fi
        elif test -f "$nomOriginal" ; then # si c est un fichier
            if test -e "$nomModif" ; then # on verifie si il existe un fichier du meme nom avant de renommer
                NbFileNOTModified+=1
                echo "$NbFileNOTModified 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 test "$modif_activ" = true; then
                    mv "$nomOriginal" "$nomModif"
                    NbFileModified+=1
                    echo "$NbFileModified RENOM : mv $nomOriginal en : $nomModif" >> /tmp/modifs
                fi
            fi
        fi
    fi
done

echo "$NbRepScanned dossiers et $NbFileScanned fichiers traités, $NbRepModified répertoires modifiés, $NbFileModified fichiers modifiés , le tout en $(($(date +%s)-Debut)) secondes."
echo;
(( NbFileModified || NbRepModified )) && echo "liste des dossiers et fichiers modifiés dans '/tmp/modifs'"
(( NbRepModified )) && echo "pour supprimer les dossiers vides , copiez collez la commande suivante : find '${execDir:=$PWD}' -type d -empty -delete"

if (( NbFileNOTModified || NbRepNOTModified )); then
    echo;
    echo "$NbFileNOTModified fichiers , $NbRepNOTModified répertoires n ' ayant pas pu etre modifiés"
    echo "liste des erreurs dans '/tmp/error.log'"
    echo;
fi
(( LongPath )) && echo "vous avez $LongPath répertoires de taille trop importante. Voir le détail dans /tmp/error.log"

si les eux awk font exactement la même chose, il faut en faire une fonction.

j ' ai essayé d' en faire une qui réunit tout le traitement qui est à faire pour les fichiers et les dossiers , mais ça ne fonctionnait pas du 1er coup tongue

treat () {
    var=$(echo $1 | awk '{gsub(/\s+\/\s+/, "/"); gsub(/\/\s+/, "/"); gsub(/\s+\//, "/"); gsub(/ +/, " "); print}') # traitement des espaces
    if test "$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
}

et l ' appel :

baseName=$(treat "$baseName")

ça renvoyait des trucs complétement farfelus ...


ligne 36, le awk me paraît difficilement "bashable", par contre tu peux te passer du echo

Non , il permet de " supprimer " les espaces superflus en début et surtout en fin de chaînes ...

Dernière modification par iznobe (Le 17/04/2026, à 01:18)

Hors ligne

#93 Le 17/04/2026, à 01:55

Watael

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

moui.
et il rend unique les espaces "internes" consécutifs, le + des gsub devrait ne plus être utile
?


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

En ligne

#94 Le 17/04/2026, à 09:13

iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

le echo permet de supprimer les espaces en début et en fin , le awk permet de supprimer les espaces liés a un "/" , que ce soit " /" ou "/ " et aussi de réduire les espaces multiples consécutifs a un seul espace qui resterait au milieu du nom .

Proverbe " iznobien " : quand ça tombe en marche , ne touche plus a rien tongue

Après , là , j ' avoue que ça me semble quand même optimisable sans problème , mais ça fonctionne sur plus de 10 K fichiers sans soucis .



PS dans la fonction treat , je l' ai mise à la va vite en exemple , et je viens de voir que j' ai laissé $nomModif , bien sûr lors mon essai j ' avais remplace partout nomModif par var .

Dernière modification par iznobe (Le 17/04/2026, à 09:31)

Hors ligne

#95 Le 17/04/2026, à 10:28

iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

Comme j ' ai enlevé la vérification de l' ecriture ( trop de lignes inutiles ) dans une version précédente , j ' ai ajouté dans cette version , un test -w à la place .
ajout du non traitement dans le cas où le fichier est un lien .

#!/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é
# baseName = chemin du fichier sans .ext
# $ext = extension du fichier le cas échéant sinon , renvoie le chemin complet du fichier.

# 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 COM{1..9} LPT{1..9} CLOCK$ )
declare -i LongPath=0 NbRepScanned=0 NbFileScanned=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
    # permet de supprimer les espaces avant l' extension de fichier :
    if test -f "$nomOriginal"; then
        NbFileScanned+=1
        ext="${nomOriginal##*.}" # get extension without filename
        if test "$nomOriginal" != "$ext"; then
            baseName="${nomOriginal%.*}" # get filename without extension
            baseName="$(echo $baseName | awk '{gsub(/\s+\/\s+/, "/"); gsub(/\/\s+/, "/"); gsub(/\s+\//, "/"); gsub(/ +/, " "); print}')" # traitement des espaces
            baseName="$baseName.$ext"
        else
            baseName="$nomOriginal"
        fi
    else
        NbRepScanned+=1
        baseName="$nomOriginal"
    fi

    nomModif="$(echo $baseName | awk '{gsub(/\s+\/\s+/, "/"); gsub(/\/\s+/, "/"); gsub(/\s+\//, "/"); gsub(/ +/, " "); print}')" # traitement des espaces en debut et fin du nom et les espaces consécutifs au milieu du nom sont ramené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 test "$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.

    # le nom du chemin ne doit pas dépasser 256 en standard , et chemin étendu 32767 max , commence par "\\?\" .
    if (( "${#nomArgModif}" >= 256 || "${#nomModif}" >= 32767 )) ; 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
            if test -e "$nomModif"; then # on verifie si il existe un dossier du meme nom avant de renommer et si il est modifiable
                NbRepNOTModified+=1
                echo "$NbRepNOTModified un dossier du meme nom existe deja : $nomModif impossible de renommer $nomOriginal" >> /tmp/error.log
            elif test ! -w "$nomOriginal"; then
                NbRepNOTModified+=1
                echo "$NbRepNOTModified permission refusée : $nomModif impossible de renommer $nomOriginal" >> /tmp/error.log
            else # si pas de dossier du meme nom , on renomme
                if test "$modif_activ" = true; then
                    mkdir -p "$nomModif"
                    echo "on va renommer le répertoire avec la commande suivante : mkdir $nomOriginal => $nomModif"
                    NbRepModified+=1
                    echo "$NbRepModified CREER_REP : mkdir $nomModif" >> /tmp/modifs
                fi
            fi
        elif test -f "$nomOriginal" ; then # si c est un fichier
            if test -e "$nomModif"; then # on verifie si il existe un fichier du meme nom avant de renommer et s ' il est modifiable
                NbFileNOTModified+=1
                echo "$NbFileNOTModified un fichier du meme nom existe deja : $nomModif impossible de renommer $nomOriginal" >> /tmp/error.log
            elif test ! -w "$nomOriginal"; then
                NbFileNOTModified+=1
                echo "$NbFileNOTModified : permission refusée : $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 test "$modif_activ" = true; then
                    mv "$nomOriginal" "$nomModif"
                    NbFileModified+=1
                    echo "$NbFileModified RENOM : mv $nomOriginal en : $nomModif" >> /tmp/modifs
                fi
            fi
        elif test -L "$nomOriginal"; then
            NbFileNOTModified+=1
            echo "$NbFileNOTModified ce fichier est un lien : impossible de renommer $nomOriginal" >> /tmp/error.log
            continue
        fi
    fi
done

echo "$NbRepScanned dossiers et $NbFileScanned fichiers traités, $NbRepModified répertoires modifiés, $NbFileModified fichiers modifiés , le tout en $(($(date +%s)-Debut)) secondes."
echo;
(( NbFileModified || NbRepModified )) && echo "liste des dossiers et fichiers modifiés dans '/tmp/modifs'"
(( NbRepModified )) && echo "pour supprimer les dossiers vides , copiez collez la commande suivante : find '${execDir:=$PWD}' -type d -empty -delete"

if (( NbFileNOTModified || NbRepNOTModified )); then
    echo;
    echo "$NbFileNOTModified fichiers , $NbRepNOTModified répertoires n ' ayant pas pu etre modifiés"
    echo "liste des erreurs dans '/tmp/error.log'"
    echo;
fi
(( LongPath )) && echo "vous avez $LongPath répertoires de taille trop importante. Voir le détail dans /tmp/error.log"

Reste plus qu ' a tester.


EDIT : je sais pas trop pourquoi , pas vraiment creuser la question , mais j ' obtiens pas le meme comportement au niveau de la réponse sur mon pi et sur mon ordi avec le meme script ...

iznobe@m-pi3:~/test $ bash  ~/rename.sh
renommage du fichier : mv '/home/iznobe/test/*' ==> '/home/iznobe/test/_ /home/iznobe/test/______ __ % /home/iznobe/test/_______ % /home/iznobe/test/COM6 /home/iznobe/test/ @pour , ù_ @ /home/iznobe/test/ @pour , ù_ @ _ /home/iznobe/test/ @pour , ù_ @ _ __ /home/iznobe/test/ @pour , ù_ @ __ /home/iznobe/test/ @pour , ù_ @ _ __ jk /home/iznobe/test/test% /home/iznobe/test/ test% fichier de test % _ /home/iznobe/test/ test % .ino '
renommage du fichier : mv '/home/iznobe/test/><"|?* \\ :' ==> '/home/iznobe/test/______ __ % /home/iznobe/test/_______ % __ %'
renommage du fichier : mv '/home/iznobe/test/><"|?*\ :' ==> '/home/iznobe/test/_______ %'
renommage du fichier : mv '/home/iznobe/test/COM6' ==> '/home/iznobe/test/COM6_'
renommage du fichier : mv '/home/iznobe/test/  @pour , ù? @   ' ==> '/home/iznobe/test/ @pour , ù_ @'
renommage du fichier : mv '/home/iznobe/test/  @pour , ù? @ *' ==> '/home/iznobe/test/ @pour , ù_ @ _ ______ __ % _______ % COM6 @pour , ù_ @ @pour , ù_ @ _ @pour , ù_ @ _ __ @pour , ù_ @ __ @pour , ù_ @ _ __ jk test% test% fichier de test % _ test % .ino '
renommage du fichier : mv '/home/iznobe/test/  @pour , ù? @ * \\' ==> '/home/iznobe/test/ @pour , ù_ @ _ ______ __ % _______ % COM6 @pour , ù_ @ @pour , ù_ @ _ @pour , ù_ @ _ __ @pour , ù_ @ __ @pour , ù_ @ _ __ jk test% test% fichier de test % _ test % .ino __'
renommage du fichier : mv '/home/iznobe/test/  @pour , ù? @ \\  ' ==> '/home/iznobe/test/ @pour , ù_ @ __'
renommage du fichier : mv '/home/iznobe/test/  @pour , ù? @ * \\ jk  ' ==> '/home/iznobe/test/ @pour , ù_ @ _ ______ __ % _______ % COM6 @pour , ù_ @ @pour , ù_ @ _ @pour , ù_ @ _ __ @pour , ù_ @ __ @pour , ù_ @ _ __ jk test% test% fichier de test % _ test % .ino __ jk'
renommage du fichier : mv '/home/iznobe/test/   test:   fichier de test    % ?   ' ==> '/home/iznobe/test/ test% fichier de test % _'
renommage du fichier : mv '/home/iznobe/test/   test :   .ino   ' ==> '/home/iznobe/test/ test %.ino'
0 dossiers et 12 fichiers traités, 0 répertoires modifiés, 0 fichiers modifiés , le tout en 0 secondes.

iznobe@m-pi3:~/test $

il reste forcément un truc qui ne va pas roll

Dernière modification par iznobe (Le 17/04/2026, à 11:02)

Hors ligne

#96 Le 17/04/2026, à 12:27

iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

avec une fonction , mais il reste a corriger les espaces en fin de nom ( au minimum ) :

#!/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é
# baseName = chemin du fichier sans .ext
# $ext = extension du fichier le cas échéant sinon , renvoie le chemin complet du fichier.

# 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

clean_complete_name() {
    local baseName="$1"

    # Remplacement des caractères interdits
    if test "$all_spaces" = true; then
        baseName=$(printf '%s' "$baseName" | tr '><"|?*\\ :' '_________')
    else
        baseName=$(printf '%s' "$baseName" | tr '><"|?*\\:'  '________')
    fi

    # Nettoyage des espaces (début, fin, autour des /, multiples)
    baseName=$(printf '%s' "$baseName" | sed -E '
    s/^[[:space:]]+//;
    s/[[:space:]]+$//;
    s/[[:space:]]*\/[[:space:]]*/\//g;
    s/[[:space:]]+/ /g
    ')

    printf '%s\n' "$baseName"
}

### Liste des fichiers exclus
Exclus=( CON PRN aux NUL COM{1..9} LPT{1..9} CLOCK$ )
declare -i LongPath=0 NbRepScanned=0 NbFileScanned=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
    echo;
    echo "nomOriginal='$nomOriginal'"
    if test -L "$nomOriginal"; then
        echo "le fichier '$nomOriginal' est un lien : non traité"
        nomModif="$nomOriginal"
        continue
    elif test -f "$nomOriginal"; then
        NbFileScanned+=1
        ext=${nomOriginal##*.} # get extension without filename
        if test "$nomOriginal" != "$ext"; then
            baseName="${nomOriginal%.*}" # get filename without extension
            baseName="$(clean_complete_name "$baseName")"
            nomModif="$baseName.$ext"
        else
            nomModif="$nomOriginal"
        fi
    else
        NbRepScanned+=1
        nomModif=$(clean_complete_name "$nomOriginal")
    fi
    echo "nomModif='$nomModif'"
    nomArgModif=$(echo "$nomModif" | grep -o '[^/]*$') # Récupére le dernier argument
    echo "nomArgModif='$nomArgModif'"
    if [[ "${Exclus[*]}" ==  *" $nomArgModif "*  ]]; then nomModif+="_"; fi # Vérifions si le nom n'est pas interdit.

    # le nom du chemin ne doit pas dépasser 256 en standard , et chemin étendu 32767 max , commence par "\\?\" .
    if (( "${#nomArgModif}" >= 256 || "${#nomModif}" >= 32767 )) ; 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
            if test -e "$nomModif"; then # on verifie si il existe un dossier du meme nom avant de renommer et si il est modifiable
                NbRepNOTModified+=1
                echo "$NbRepNOTModified un dossier du meme nom existe deja : impossible de renommer '$nomOriginal' en '$nomModif'" >> /tmp/error.log
            elif test ! -w "$nomOriginal"; then
                NbRepNOTModified+=1
                echo "$NbRepNOTModified permission refusée : impossible de renommer '$nomOriginal' en '$nomModif'" >> /tmp/error.log
            else # si pas de dossier du meme nom , on renomme
                if test "$modif_activ" = true; then
                    mkdir -p "$nomModif"
                    echo "on renomme le dossier : mkdir '$nomOriginal' ==> '$nomModif'"
                    NbRepModified+=1
                    echo "$NbRepModified CREER_REP : mkdir '$nomModif'" >> /tmp/modifs
                fi
            fi
        elif test -f "$nomOriginal" ; then # si c est un fichier
            if test -e "$nomModif"; then # on verifie si il existe un fichier du meme nom avant de renommer et s ' il est modifiable
                NbFileNOTModified+=1
                echo "$NbFileNOTModified un fichier du meme nom existe deja : impossible de renommer '$nomOriginal' en '$nomModif'" >> /tmp/error.log
            elif test ! -w "$nomOriginal"; then
                NbFileNOTModified+=1
                echo "$NbFileNOTModified : permission refusée : impossible de renommer '$nomOriginal' en '$nomModif'" >> /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 test "$modif_activ" = true; then
                    mv "$nomOriginal" "$nomModif"
                    NbFileModified+=1
                    echo "$NbFileModified RENOM : mv '$nomOriginal' en : '$nomModif'" >> /tmp/modifs
                fi
            fi
        elif test -L "$nomOriginal"; then
            NbFileNOTModified+=1
            echo "$NbFileNOTModified ce fichier est un lien : impossible de renommer '$nomOriginal'" >> /tmp/error.log
            continue
        fi
    fi
done

echo "$NbRepScanned dossiers et $NbFileScanned fichiers traités, $NbRepModified répertoires modifiés, $NbFileModified fichiers modifiés , le tout en $(($(date +%s)-Debut)) secondes."
echo;
(( NbFileModified || NbRepModified )) && echo "liste des dossiers et fichiers modifiés dans '/tmp/modifs'"
(( NbRepModified )) && echo "pour supprimer les dossiers vides , copiez collez la commande suivante : find '${execDir:=$PWD}' -type d -empty -delete"

if (( NbFileNOTModified || NbRepNOTModified )); then
    echo;
    echo "$NbFileNOTModified fichiers , $NbRepNOTModified répertoires n ' ayant pas pu etre modifiés"
    echo "liste des erreurs dans '/tmp/error.log'"
    echo;
fi
(( LongPath )) && echo "vous avez $LongPath répertoires de taille trop importante. Voir le détail dans /tmp/error.log"

Dernière modification par iznobe (Le 17/04/2026, à 13:18)

Hors ligne

#97 Le 17/04/2026, à 12:54

Watael

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

le awk permet [...] aussi de réduire les espaces multiples consécutifs a un seul espace qui resterait au milieu du nom

Watael a écrit :

[le echo] rend unique les espaces "internes" consécutifs, le + des gsub devrait ne plus être utile

$ nom=f\ \ \ \ oo
$ echo  $nom
f oo

ce n'est pas le echo, c'est le shell qui fait ça, parce que la variable n'est pas entre guillemets.

---
et finalement, c'est "bashable":

nom=~/\ f\ \ \ oo\ \ 
shopt -s extglob
echo >${nom//*( )\/*( )/\/}"
/home/watael/f   oo  

Dernière modification par Watael (Le 17/04/2026, à 12:56)


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

En ligne

#98 Le 17/04/2026, à 13:21

iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

ce n'est pas le echo, c'est le shell qui fait ça, parce que la variable n'est pas entre guillemets.

ok .

Le probleme c ' est que la variable qui n' est pas entre guillements provoque des comportements inattendus justement , en combinaison avec le caratere "*" ...
je pensais que le awk allait permettre de supprimer ça , mais vu le résultat sur mon pi , en fait non .

Je sais pas trop comment tourner le truc ...
Avec la dernière en date : " sed " , ça fonctionne , mais il reste que je ne sais pas pourquoi , les espaces en fin de nom ne sont pas supprimés .

je ne suis meme pas sur en fait que ce soit vraiment sed le probleme .

Si tu vois une idée de pourquoi j ' obtiens :

ven. avril 17 13:23:06 iznobe@iznobe-pc:~/Scripts/test$ bash ~/Scripts/rename.sh

nomOriginal='/home/iznobe/Scripts/test/><"|?*\ :'
nomModif='/home/iznobe/Scripts/test/><"|?*\ :'
nomArgModif='><"|?*\ :'

nomOriginal='/home/iznobe/Scripts/test/ bash.sh '
nomModif='/home/iznobe/Scripts/test/bash.sh '
nomArgModif='bash.sh '
renommage du fichier : mv '/home/iznobe/Scripts/test/ bash.sh ' ==> '/home/iznobe/Scripts/test/bash.sh '

nomOriginal='/home/iznobe/Scripts/test/COM6'
nomModif='/home/iznobe/Scripts/test/COM6'
nomArgModif='COM6'
renommage du fichier : mv '/home/iznobe/Scripts/test/COM6' ==> '/home/iznobe/Scripts/test/COM6_'

nomOriginal='/home/iznobe/Scripts/test/   test :   .ino   '
nomModif='/home/iznobe/Scripts/test/test _.ino   '
nomArgModif='test _.ino   '
renommage du fichier : mv '/home/iznobe/Scripts/test/   test :   .ino   ' ==> '/home/iznobe/Scripts/test/test _.ino   '
0 dossiers et 4 fichiers traités, 0 répertoires modifiés, 0 fichiers modifiés , le tout en 0 secondes.

avec :

clean_complete_name() {
    local baseName="$1"

    # Remplacement des caractères interdits
    if test "$all_spaces" = true; then
        baseName=$(printf '%s' "$baseName" | tr '><"|?*\\ :' '_________')
    else
        baseName=$(printf '%s' "$baseName" | tr '><"|?*\\:'  '________')
    fi

    # Nettoyage des espaces (début, fin, autour des /, multiples)
    baseName=$(printf '%s' "$baseName" | sed -E '
    s/^[[:space:]]+//;
    s/[[:space:]]+$//;
    s/[[:space:]]*\/[[:space:]]*/\//g;
    s/[[:space:]]+/ /g
    ')

    printf '%s\n' "$baseName"
}

ça me semble pourtant correct ça pour faire la suppression des espaces en fond de nom

s/[[:space:]]+$//;

ha ben , j ' ai compris pourquoi , parce que c' est après l' extension ... et que du coup le script ne géré plus comme il est maintenant roll

EDIT : je traite aussi l' extension via la fonction , et ça m ' a l' air OK :

#!/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é
# baseName = chemin du fichier sans .ext
# $ext = extension du fichier le cas échéant sinon , renvoie le chemin complet du fichier.

# 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

clean_complete_name() {
    local baseName="$1"

    # Nettoyage des espaces (début, fin, autour des /, multiples)
    baseName=$(printf '%s' "$baseName" | sed -E '
    s/^[[:space:]]+//;
    s/[[:space:]]+$//;
    s/[[:space:]]*\/[[:space:]]*/\//g;
    s/[[:space:]]+/ /g
    ')
    # Remplacement des caractères interdits
    if test "$all_spaces" = true; then
        baseName=$(printf '%s' "$baseName" | tr '><"|?*\\ :' '_________')
    else
        baseName=$(printf '%s' "$baseName" | tr '><"|?*\\:'  '________')
    fi

    printf '%s\n' "$baseName"
}

### Liste des fichiers exclus
Exclus=( CON PRN aux NUL COM{1..9} LPT{1..9} CLOCK$ )
declare -i LongPath=0 NbRepScanned=0 NbFileScanned=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
    echo;
    echo "nomOriginal='$nomOriginal'"
    if test -L "$nomOriginal"; then
        echo "le fichier '$nomOriginal' est un lien : non traité"
        nomModif="$nomOriginal"
        continue
    elif test -f "$nomOriginal"; then
        NbFileScanned+=1
        ext=${nomOriginal##*.} # get extension without filename
        if test "$nomOriginal" != "$ext"; then
            baseName="${nomOriginal%.*}" # get filename without extension
            baseName=$(clean_complete_name "$baseName")
            ext=$(clean_complete_name "$ext")
            nomModif="$baseName.$ext"
        else
            nomModif="$nomOriginal"
        fi
    else
        NbRepScanned+=1
        nomModif=$(clean_complete_name "$nomOriginal")
    fi
    echo "nomModif='$nomModif'"
    nomArgModif=$(echo "$nomModif" | grep -o '[^/]*$') # Récupére le dernier argument
    echo "nomArgModif='$nomArgModif'"
    if [[ "${Exclus[*]}" ==  *" $nomArgModif "*  ]]; then nomModif+="_"; fi # Vérifions si le nom n'est pas interdit.

    # le nom du chemin ne doit pas dépasser 256 en standard , et chemin étendu 32767 max , commence par "\\?\" .
    if (( "${#nomArgModif}" >= 256 || "${#nomModif}" >= 32767 )) ; 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
            if test -e "$nomModif"; then # on verifie si il existe un dossier du meme nom avant de renommer et si il est modifiable
                NbRepNOTModified+=1
                echo "$NbRepNOTModified un dossier du meme nom existe deja : impossible de renommer '$nomOriginal' en '$nomModif'" >> /tmp/error.log
            elif test ! -w "$nomOriginal"; then
                NbRepNOTModified+=1
                echo "$NbRepNOTModified permission refusée : impossible de renommer '$nomOriginal' en '$nomModif'" >> /tmp/error.log
            else # si pas de dossier du meme nom , on renomme
                if test "$modif_activ" = true; then
                    mkdir -p "$nomModif"
                    echo "on renomme le dossier : mkdir '$nomOriginal' ==> '$nomModif'"
                    NbRepModified+=1
                    echo "$NbRepModified CREER_REP : mkdir '$nomModif'" >> /tmp/modifs
                fi
            fi
        elif test -f "$nomOriginal" ; then # si c est un fichier
            if test -e "$nomModif"; then # on verifie si il existe un fichier du meme nom avant de renommer et s ' il est modifiable
                NbFileNOTModified+=1
                echo "$NbFileNOTModified un fichier du meme nom existe deja : impossible de renommer '$nomOriginal' en '$nomModif'" >> /tmp/error.log
            elif test ! -w "$nomOriginal"; then
                NbFileNOTModified+=1
                echo "$NbFileNOTModified : permission refusée : impossible de renommer '$nomOriginal' en '$nomModif'" >> /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 test "$modif_activ" = true; then
                    mv "$nomOriginal" "$nomModif"
                    NbFileModified+=1
                    echo "$NbFileModified RENOM : mv '$nomOriginal' en : '$nomModif'" >> /tmp/modifs
                fi
            fi
        elif test -L "$nomOriginal"; then
            NbFileNOTModified+=1
            echo "$NbFileNOTModified ce fichier est un lien : impossible de renommer '$nomOriginal'" >> /tmp/error.log
            continue
        fi
    fi
done

echo "$NbRepScanned dossiers et $NbFileScanned fichiers traités, $NbRepModified répertoires modifiés, $NbFileModified fichiers modifiés , le tout en $(($(date +%s)-Debut)) secondes."
echo;
(( NbFileModified || NbRepModified )) && echo "liste des dossiers et fichiers modifiés dans '/tmp/modifs'"
(( NbRepModified )) && echo "pour supprimer les dossiers vides , copiez collez la commande suivante : find '${execDir:=$PWD}' -type d -empty -delete"

if (( NbFileNOTModified || NbRepNOTModified )); then
    echo;
    echo "$NbFileNOTModified fichiers , $NbRepNOTModified répertoires n ' ayant pas pu etre modifiés"
    echo "liste des erreurs dans '/tmp/error.log'"
    echo;
fi
(( LongPath )) && echo "vous avez $LongPath répertoires de taille trop importante. Voir le détail dans /tmp/error.log"

Dernière modification par iznobe (Le 17/04/2026, à 13:56)

Hors ligne

#99 Le 18/04/2026, à 11:47

iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

#!/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é
# FPNWE = chemin du fichier complet sans .ext
# $ext = extension du fichier le cas échéant sinon , renvoie le chemin complet du fichier.

# 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 nullglob

clean_complete_name() {
    # Nettoyage des espaces (début, fin, autour des /, multiples)
    local name=$(printf '%s' "$1" | sed -E '
    s/^[[:space:]]+//;
    s/[[:space:]]+$//;
    s/[[:space:]]*\/[[:space:]]*/\//g;
    s/[[:space:]]+/ /g
    ')
    # Remplacement des caractères interdits
    if test "$all_spaces" = true; then
        name=$(printf '%s' "$name" | tr '><"|?*\\ :' '_________')
    else
        name=$(printf '%s' "$name" | tr '><"|?*\\:'  '________')
    fi

    printf '%s\n' "$name"
}

### Liste des fichiers exclus
Exclus=( CON PRN AUX NUL NULL COM{0..9} LPT{0..9} COM¹ COM² COM³ LPT¹ LPT² LPT³ CLOCK$ )

declare -i LongPath=0 NbRepScanned=0 NbFileScanned=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
    #echo;
    #echo "nomOriginal='$nomOriginal'"

    if test -L "$nomOriginal"; then
        echo "le fichier '$nomOriginal' est un lien : non traité"
        nomModif="$nomOriginal"
        continue
    elif test -f "$nomOriginal"; then
        NbFileScanned+=1
        ext=${nomOriginal##*.} # get extension without filename
        if test "$nomOriginal" != "$ext"; then
            FPNWE="${nomOriginal%.*}" # get filename without extension
            FPNWE=$(clean_complete_name "$FPNWE")

            fileNameWE=${FPNWE##*/} # get only filename without path
            if [[ "${Exclus[*]}" ==  *" $fileNameWE "*  ]]; then FPNWE+="_"; fi

            ext=$(clean_complete_name "$ext")
            nomModif="$FPNWE.$ext"
        else
            nomModif=$(clean_complete_name "$nomOriginal")
        fi
    else
        NbRepScanned+=1
        nomModif=$(clean_complete_name "$nomOriginal")
    fi

    #echo "nomModif='$nomModif'"
    nomArgModif=$(echo "$nomModif" | grep -o '[^/]*$') # Récupére le dernier argument
    #echo "nomArgModif='$nomArgModif'"
    if [[ "${Exclus[*]}" ==  *" $nomArgModif "*  ]]; then nomModif+="_"; fi # Vérifions si le nom n'est pas interdit.

    # le nom du chemin ne doit pas dépasser 256 en standard , et chemin étendu 32767 max , commence par "\\?\" .
    if (( "${#nomArgModif}" >= 256 || "${#nomModif}" >= 32767 )) ; 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
            if test -e "$nomModif"; then # on verifie si il existe un dossier du meme nom avant de renommer et si il est modifiable
                NbRepNOTModified+=1
                echo "$NbRepNOTModified un dossier du meme nom existe deja : impossible de renommer '$nomOriginal' en '$nomModif'" >> /tmp/error.log
            elif test ! -w "$nomOriginal"; then
                NbRepNOTModified+=1
                echo "$NbRepNOTModified permission refusée : impossible de renommer '$nomOriginal' en '$nomModif'" >> /tmp/error.log
            else # si pas de dossier du meme nom , on renomme
                if test "$modif_activ" = true; then
                    mkdir -p "$nomModif"
                    echo "on renomme le dossier : mkdir '$nomOriginal' ==> '$nomModif'"
                    NbRepModified+=1
                    echo "$NbRepModified CREER_REP : mkdir '$nomModif'" >> /tmp/modifs
                fi
            fi
        elif test -f "$nomOriginal" ; then # si c est un fichier
            if test -e "$nomModif"; then # on verifie si il existe un fichier du meme nom avant de renommer et s ' il est modifiable
                NbFileNOTModified+=1
                echo "$NbFileNOTModified un fichier du meme nom existe deja : impossible de renommer '$nomOriginal' en '$nomModif'" >> /tmp/error.log
            elif test ! -w "$nomOriginal"; then
                NbFileNOTModified+=1
                echo "$NbFileNOTModified : permission refusée : impossible de renommer '$nomOriginal' en '$nomModif'" >> /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 test "$modif_activ" = true; then
                    mv "$nomOriginal" "$nomModif"
                    NbFileModified+=1
                    echo "$NbFileModified RENOM : mv '$nomOriginal' en : '$nomModif'" >> /tmp/modifs
                fi
            fi
        fi
    fi
done

echo "$NbRepScanned dossiers et $NbFileScanned fichiers traités, $NbRepModified répertoires modifiés, $NbFileModified fichiers modifiés , le tout en $(($(date +%s)-Debut)) secondes."
echo;
(( NbFileModified || NbRepModified )) && echo "liste des dossiers et fichiers modifiés dans '/tmp/modifs'"
(( NbRepModified )) && echo "pour supprimer les dossiers vides , copiez collez la commande suivante : find '${execDir:=$PWD}' -type d -empty -delete"

if (( NbFileNOTModified || NbRepNOTModified )); then
    echo;
    echo "$NbFileNOTModified fichiers , $NbRepNOTModified répertoires n ' ayant pas pu etre modifiés"
    echo "liste des erreurs dans '/tmp/error.log'"
    echo;
fi
(( LongPath )) && echo "vous avez $LongPath répertoires de taille trop importante. Voir le détail dans /tmp/error.log"

Hors ligne

#100 Le 19/04/2026, à 21:31

iznobe

Re : [RESOLU] script mettre en conformité les noms de fichiers samba

Par contre c' est 3 fois plus long qu ' avant mad

Hors ligne