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.

#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. big_smile


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 -delete

la version avec  arrive dans 2 minutes . mais elle me parait plus longue .

ba , que neni , c' est exactement pareil tongue

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 tongue ) 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"

wink


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

big_smile

37     nomArgModif=$(echo "$nomModif" | grep -o '[^/]*$' ) # Récupére le dernier argument

tu ne veux pas t'essayer au BASH_REMATCH ?

40     if [[ "${#nomArgModif}" -ge 248 || "${#nomModif}"  -ge 32384 ]] ; then # Vérifions si la longueur

tu 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à ?

wink

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

Watael a écrit :

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 tongue. 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 wink

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.

lol lol lol

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. wink


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

Watael a écrit :

c'est un "problème" de cohérence

j ' ai " coherer " le tout tongue


Sinon , pour ça : https://forum.ubuntu-fr.org/viewtopic.p … #p22891310

AlbertN a écrit :

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. hmm


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 big_smile ?

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
fi

ré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 .EXT

donc , 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