Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 27/12/2021, à 21:09

iznobe

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

Bonjour geole et merci pour la correction wink mais je ne suis pas sur que ce soit vraiment le bug , j2 c ' est le dernier argument sans le chemin non ?
du coup ca teste que le dernier argument n' as pas plus de 247 caracteres , ou je me trompe ?
et la 2eme ligne verifie que le nom complet (avec chemin donc ) ne depasse pas 323283 .

#Vérifions si la longueur n'est pas excessive
    if [[ ${#j2}  -ge   248 ]]; then Long=$(($Long+1)); echo $j >>/tmp/LongFic ; fi
    if [[ ${#j}   -ge 32384 ]]; then Long=$(($Long+1)); echo $j >>/tmp/LongFic ; fi

juste une question en passant , pourquoi multiplier les variables , ca n' a pas grand interet dans ce script ?

a mon avis c' est cette ligne qui pose probleme :

if [[ " ${Exclus[@]} " =~  $j2  ]]; then j="$j""_" ; fi

Mais , je comprends pas bien la 1ere insctruction , mais presque sur que le soucis est dans celle-ci big_smile
la 2eme dis simplement de transformer la variable $j elle meme en ajoutant un "_" a la fin .

d' ailleurs on voit clairement dans la sortie que ca correspond bien aux caracteres exclus  et non a la suite de caracteres :

on va renommer ce répertoire avec la commande suivante : mkdir 'a_'
on va renommer ce répertoire avec la commande suivante : mkdir 'u_'
on va renommer ce répertoire avec la commande suivante : mkdir 'x_'

et uniquement pour des dossiers .

Dernière modification par iznobe (Le 27/12/2021, à 21:22)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM . avec Ubuntu , LM et W$10

Hors ligne

#27 Le 28/12/2021, à 03:08

iznobe

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

+ simplification des tests pour la gestion des espaces , merci a @watael et @MicP pour leur aide a ce sujet : https://forum.ubuntu-fr.org/viewtopic.p … #p22519336
+ suppresion de variable inutiles
+ simplification des tests de suppression des caracteres interdits de windows .

vitesse grandement amelioré !

Reste encore a corrigé le soucis avec les noms interdits , la prise en charge de fichiers dans certains conditions ne se fait pas , et la suppresion des repertoires vides a la fin de la boucle , qui semble etre a faire aussi .

Bien sur toute autre amelioration , implementation est bienvenue big_smile

Dernière modification par iznobe (Le 29/12/2021, à 14:30)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM . avec Ubuntu , LM et W$10

Hors ligne

#28 Le 28/12/2021, à 13:10

geole

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

iznobe a écrit :

a mon avis c' est cette ligne qui pose probleme :

if [[ " ${Exclus[@]} " =~  $j2  ]]; then j="$j""_" ; fi

Bonjour
Un mauvais test a partir  d'un exemple incompris
Il compare caractère par caractère.
Je redeviens plus classique en boucle

for t in "${Exclus[@]}"; do
       if [[ "$t" =  "$j2"  ]]; then j="$j""_" ; fi
done  

Tu noteras que j'ai supprimé la variable k  pour rester avec j comme tu avais signalé son inutilité.

Dernière modification par geole (Le 28/12/2021, à 13:11)

Hors ligne

#29 Le 28/12/2021, à 13:29

iznobe

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

effectivement avec la boucle pour les exclus , on arrive a quelquechose qui fonctionne pas trop mal , a tester plus en profondeur .

je laisse les commentaires pour faciliter la comprehension et les modifications , si certains sont motivés pour tester et / ou ameliorer ce script .

# $i = nom complet rep ou fichier original
# $i1 = chemin relatif du repertoire original
# $j = nom complet rep ou fichier modifié
# $j1 = chemin relatif du repertoire modifié
# $j2 = nom dernier argument modifié

shopt -s globstar
modif_activ=rue;

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

Long=0; Nbrep=0; Nbfilemodified=0; Nbrepmodified=0; NbfileNOTmodified=0; Debut=$(echo $(date +%s));
echo "liste des fichiers n ' ayant pas pu etre modifiés :" > /tmp/nomodifs
echo "-------------------" > /tmp/modifs

for i in **/*; do
    Nbrep=$(($Nbrep+1))
    # traitement des espaces    
    j=$(echo $i | sed 's@ */ *@/@g')

    # remplacement d'un maxima de caractères interdits par windows ><\:"|?*
    j=$(echo "$j"  | tr '><"|?*:\\' '!!!!!!!%') # echappement de "\" par le meme signe donc 2 \\ pour qu un soit remplacé 

    # Vérifions si le nom n'est pas interdit. Récupération du dernier argument
    j2=$(echo "$j" | grep -o '[^/]*$' )
    #if [[ ${Exclus[@]} =~  "$j2"  ]]; then j=$(echo "$j""_") ; echo "$j" ; fi
    for t in "${Exclus[@]}"; do
       if [[ "$t" =  "$j2"  ]]; then j="$j""_" ; fi
    done

    # Vérifions si la longueur n'est pas excessive
    if [[ ${#j2} -ge   248 || ${#j}  -ge 32384 ]] ; then
        if [[ $long -eq 0 ]]; then echo "[url]https://www.pcastuces.com/pratique/astuces[/url]" > /tmp/LongFic ; fi
        Long=$(($Long+1))
        echo "$Long : $j" >> /tmp/LongFic
    fi

    if [[ $i != $j ]]; then # si il y a un changement a effectuer
    
        if test -d "$i" ; then # si c' est un dossier
            if test -e "$j" ; then # on verifie si il existe un dossier du meme nom avant de renommer
                # si deja un dossier du meme nom , on stocke l' erreur
                NbfileNOTmodified=$(($NbfileNOTmodified+1))
                echo "$Nbrep un dossier du meme nom existe deja :'$j' impossible de renommer '$i'" >> /tmp/nomodifs
            else # si pas de dossier du meme nom , on renomme
            echo "on va renommer ce répertoire avec la commande suivante : mkdir '$j'"
                if [ "$modif_activ" = true ] ; then
                    mkdir "$j"
                    if test -e "$j" ; then # si la creation du repertoire a reussi
                        # enregistrement des changements
                        echo "$Nbrep CREERREP : mkdir '$j'" >> /tmp/modifs
                        Nbrepmodified=$(($Nbrepmodified+1))
                        # on deplace tout le contenu de l' ancien repertoire dans le nouveau
                        # creer une fonction de la boucle et l' appeler ici a la place .
                        # for x in $i; do
                            # echo "mv $x $j" >> /tmp/modifs
                        # done
                        # echo "rmdir $i" >> /tmp/modifs
                        
                    else
                        NbfileNOTmodified=$(($NbfileNOTmodified+1))
                        echo "$Nbrep erreur inconnue pour repertoire : '$i'" >> /tmp/nomodifs
                    fi
                fi
            fi
        elif test -f "$i" ; then # si c est un fichier
            # on verifie si il existe un fichier du meme nom avant de renommer
            if test -e "$j" ; then # si deja un fichier du meme nom , on stocke l' erreur
                NbfileNOTmodified=$(($NbfileNOTmodified+1))
                echo "$Nbrep un fichier du meme nom existe deja :\'$j\' impossible de renommer \'$i\'" >> /tmp/nomodifs
            else # si pas de fichier du meme nom , on renomme
                # chemin relatif du repertoire original
                i1=$(echo "$i" | rev | cut -d/  --complement -s -f1 | rev)
                # Récupérons le chemin apres modif 
                j1=$(echo "$j" | rev | cut -d/  --complement -s -f1 | rev) # donne le chemin relatif du repertoire modifié .
                if [[ $i1 != $j1 ]]; then # si les chemins sont differents , c' est que l' arborescence a été modifiée :
                    # dans ce cas on utilise l' arborescence modifiée precedemment + le nom modifié du dernier argument pour la destination
                    j=$(echo "$j1/$j2")
                else # sinon il suffit de ne pas tenir compte de l' arboresecence puisqu ' elle est identique
                    # recuperation nom original du dernier argument
                    i=$(echo "$i" | grep -o '[^/]*$' ) # on utilise juste le nom de fichier original pour la src
                    j=$(echo "$j" | grep -o '[^/]*$' ) # on utilise que le nom du fichier modifié pour la destination 
                fi
                echo "on va renommer ce fichier avec la commande suivante : mv '$i'  '$j'"
                if [ "$modif_activ" = true ] ; then
                    mv "$i" "$j"
                    # puis on verifie que le fichier renommé existe bien :
                    if test -e "$j" ; then # si le fichier existe on incremente
                        # enregistrement des changements
                        echo "$Nbrep RENOM : mv '$i' en : '$j'" >> /tmp/modifs
                        Nbfilemodified=$(($Nbfilemodified+1))
                    else # sinon => erreur
                        NbfileNOTmodified=$(($NbfileNOTmodified+1))
                        echo "$Nbrep erreur inconnue pour fichier : '$i'" >> /tmp/nomodifs
                    fi
                fi
            fi
        else # sinon => erreur
            NbfileNOTmodified=$(($NbfileNOTmodified+1))
            echo "$Nbrep erreur inconnue pour : '$i'" >> /tmp/nomodifs
        fi
    fi

done
echo ""
echo "$Nbrep répertoires et fichiers traités, $Nbrepmodified répertoires modifiés, $Nbfilemodified fichiers modifiés, $NbfileNOTmodified répertoires et fichiers n ' ayant pas pu etre modifiés en $(($(date +%s)-$Debut)) secondes."
echo ""
echo "liste des fichiers modifiés ou pas dans '/tmp/modifs' et '/tmp/nomodifs'"
echo ""
if [[ $Long > 0 ]]; then echo "vous avez $Long répertoires de taille importante. Voir le détail dans /tmp/LongFic" ; fi

echo "pour supprimer les dossiers vides , copiez collez la commande suivante : for i in **/*; do find . -type d -empty -print -delete ; done"

cela dit , si quelqu ' un a une version pour renommer les fichiers de la liste Eclus sans passer par une boucle , ca serait top big_smile

Dernière modification par iznobe (Le 28/12/2021, à 14:59)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM . avec Ubuntu , LM et W$10

Hors ligne

#30 Le 28/12/2021, à 13:50

geole

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

Tu avais signalé des problèmes pour les fichiers avec des  [  et des  ]

@a:~/TEST$

a@a:~/TEST$ 
a@a:~/TEST$ touch   "                        fICHIER           [entre]     crochet     "
a@a:~/TEST$ 
a@a:~/TEST$ touch   "                        fICHIER           [       entre   '  ] crochets    "
a@a:~/TEST$ ls -als
total 8
4 drwxrwxr-x  2 a a 4096 déc.  28 12:39  .
4 drwxr-xr-x 20 a a 4096 déc.  28 11:31  ..
0 -rw-rw-r--  1 a a    0 déc.  28 12:38 '                        fICHIER           [entre]     crochet     '
0 -rw-rw-r--  1 a a    0 déc.  28 12:39 '                        fICHIER           [       entre   '\''  ] crochets    '
a@a:~/TEST$ 
a@a:~/TEST$ 

Cependant, le script se lance bien  et le résultat est celui prévu.

on va renommer ce répertoire/fichier avec cette commande mv -n '                        fICHIER           [       entre   '  ] crochets    ' fICHIER [ entre ' ] crochets
a@a:~/TEST$ if [[ $Long > 0 ]]; then echo vous avez $Long répertoires de taille importante. Voir le détail dans /tmp/LongFic ; fi
a@a:~/TEST$ echo $Nbrep répertoires et fichiers traités en  $(($(date +%s)-$Debut)) secondes.
2 répertoires et fichiers traités en 5 secondes.
a@a:~/TEST$ ls -ls
total 0
0 -rw-rw-r-- 1 a a 0 déc.  28 12:44 'fICHIER [entre] crochet'
0 -rw-rw-r-- 1 a a 0 déc.  28 12:45 'fICHIER [ entre '\'' ] crochets'

Le problème semble après, il veut encore renommer....

Il est impossible de changer le nom de ce fichier/dossier 'fICHIER [entre] crochet' car présence de doublon au niveau fichier
Il est impossible de changer le nom de ce fichier/dossier 'fICHIER [ entre ' ] crochets' car présence de doublon au niveau fichier

en plus court....

Il est impossible de changer le nom de ce fichier/dossier '[fic]' car présence de doublon au niveau fichier
a@a:~/TEST$ if [[ $Long > 0 ]]; then echo vous avez $Long répertoires de taille importante. Voir le détail dans /tmp/LongFic ; fi
a@a:~/TEST$ echo $Nbrep répertoires et fichiers traités en  $(($(date +%s)-$Debut)) secondes.
1 répertoires et fichiers traités en 40 secondes.

a@a:~/TEST$ ls -ls
total 0
0 -rw-rw-r-- 1 a a 0 déc.  28 12:58 '[fic]'

Idée 1, si le nom contient un  crochet on ne fait pas le test de présence et on laisse la commande mv qui ralera ou pas
Idée 2, on ne fait jamais  le test et on récupère les erreurs de l'exécution s'il y en a....

Dernière modification par geole (Le 28/12/2021, à 14:05)

Hors ligne

#31 Le 28/12/2021, à 14:28

iznobe

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

chez moi il fonctionne des 2 manieres l ' une ou l ' autre au choix voici le resultat en un copier coller :

iznobe@iznobe-PC:~/Scripts/teste$ for i in **/*; do
>     Nbrep=$(($Nbrep+1))
>     # traitement des espaces    
>     j=$(echo $i | sed 's@ */ *@/@g')
> 
>     # remplacement d'un maxima de caractères interdits par windows ><\:"|?*
>     j=$(echo "$j"  | tr '><"|?*:\\' '!!!!!!!%') # echappement de "\" par le meme signe donc 2 \\ pour qu un soit remplacé 
> 
>     # Vérifions si le nom n'est pas interdit. Récupération du dernier argument
>     j2=$(echo "$j" | grep -o '[^/]*$' )
>     #if [[ ${Exclus[@]} =~  "$j2"  ]]; then j=$(echo "$j""_") ; echo "$j" ; fi
>     for t in "${Exclus[@]}"; do
>        if [[ "$t" =  "$j2"  ]]; then j="$j""_" ; fi
>     done
> 
>     # Vérifions si la longueur n'est pas excessive
>     if [[ ${#j2} -ge   248 || ${#j}  -ge 32384 ]] ; then
>         if [[ $long -eq 0 ]]; then echo "[url]https://www.pcastuces.com/pratique/astuces[/url]" > /tmp/LongFic ; fi
>         Long=$(($Long+1))
>         echo "$Long : $j" >> /tmp/LongFic
>     fi
> 
>     if [[ $i != $j ]]; then # si il y a un changement a effectuer
>     
>         if test -d "$i" ; then # si c' est un dossier
>             if test -e "$j" ; then # on verifie si il existe un dossier du meme nom avant de renommer
>                 # si deja un dossier du meme nom , on stocke l' erreur
>                 NbfileNOTmodified=$(($NbfileNOTmodified+1))
>                 echo "$Nbrep un dossier du meme nom existe deja :'$j' impossible de renommer '$i'" >> /tmp/nomodifs
>             else # si pas de dossier du meme nom , on renomme
>             echo "on va renommer ce répertoire avec la commande suivante : mkdir '$j'"
>                 if [ "$modif_activ" = true ] ; then
>                     mkdir "$j"
>                     if test -e "$j" ; then # si la creation du repertoire a reussi
>                         # enregistrement des changements
>                         echo "$Nbrep CREERREP : mkdir '$j'" >> /tmp/modifs
>                         Nbrepmodified=$(($Nbrepmodified+1))
>                         # on deplace tout le contenu de l' ancien repertoire dans le nouveau
>                         # creer une fonction de la boucle et l' appeler ici a la place .
>                         for x in $i; do
>                             echo "mv $x $j" >> /tmp/modifs
>                         done
>                         echo "rmdir $i" >> /tmp/modifs
>                         
>                     else
>                         NbfileNOTmodified=$(($NbfileNOTmodified+1))
>                         echo "$Nbrep erreur inconnue pour repertoire : '$i'" >> /tmp/nomodifs
>                     fi
>                 fi
>             fi
>         elif test -f "$i" ; then # si c est un fichier
>             # on verifie si il existe un fichier du meme nom avant de renommer
>             if test -e "$j" ; then # si deja un fichier du meme nom , on stocke l' erreur
>                 NbfileNOTmodified=$(($NbfileNOTmodified+1))
>                 echo "$Nbrep un fichier du meme nom existe deja :\'$j\' impossible de renommer \'$i\'" >> /tmp/nomodifs
>             else # si pas de fichier du meme nom , on renomme
>                 # chemin relatif du repertoire original
>                 i1=$(echo "$i" | rev | cut -d/  --complement -s -f1 | rev)
>                 # Récupérons le chemin apres modif 
>                 j1=$(echo "$j" | rev | cut -d/  --complement -s -f1 | rev) # donne le chemin relatif du repertoire modifié .
>                 if [[ $i1 != $j1 ]]; then # si les chemins sont differents , c' est que l' arborescence a été modifiée :
>                     # dans ce cas on utilise l' arborescence modifiée precedemment + le nom modifié du dernier argument pour la destination
>                     j=$(echo "$j1/$j2")
>                 else # sinon il suffit de ne pas tenir compte de l' arboresecence puisqu ' elle est identique
>                     # recuperation nom original du dernier argument
>                     i=$(echo "$i" | grep -o '[^/]*$' ) # on utilise juste le nom de fichier original pour la src
>                     j=$(echo "$j" | grep -o '[^/]*$' ) # on utilise que le nom du fichier modifié pour la destination 
>                 fi
>                 echo "on va renommer ce fichier avec la commande suivante : mv '$i'  '$j'"
>                 if [ "$modif_activ" = true ] ; then
>                     mv "$i" "$j"
>                     # puis on verifie que le fichier renommé existe bien :
>                     if test -e "$j" ; then # si le fichier existe on incremente
>                         # enregistrement des changements
>                         echo "$Nbrep RENOM : mv '$i' en : '$j'" >> /tmp/modifs
>                         Nbfilemodified=$(($Nbfilemodified+1))
>                     else # sinon => erreur
>                         NbfileNOTmodified=$(($NbfileNOTmodified+1))
>                         echo "$Nbrep erreur inconnue pour fichier : '$i'" >> /tmp/nomodifs
>                     fi
>                 fi
>             fi
>         else # sinon => erreur
>             NbfileNOTmodified=$(($NbfileNOTmodified+1))
>             echo "$Nbrep erreur inconnue pour : '$i'" >> /tmp/nomodifs
>         fi
>     fi
> 
> done
on va renommer ce fichier avec la commande suivante : mv 'aux'  'aux_'
on va renommer ce fichier avec la commande suivante : mv '     reeee    '  'reeee'
iznobe@iznobe-PC:~/Scripts/teste$ echo ""

iznobe@iznobe-PC:~/Scripts/teste$ echo "$Nbrep répertoires et fichiers traités, $Nbrepmodified répertoires modifiés, $Nbfilemodified fichiers modifiés, $NbfileNOTmodified répertoires et fichiers n ' ayant pas pu etre modifiés en $(($(date +%s)-$Debut)) secondes."
12 répertoires et fichiers traités, 0 répertoires modifiés, 0 fichiers modifiés, 0 répertoires et fichiers n ' ayant pas pu etre modifiés en 0 secondes.
iznobe@iznobe-PC:~/Scripts/teste$ echo ""

iznobe@iznobe-PC:~/Scripts/teste$ echo "liste des fichiers modifiés ou pas dans '/tmp/modifs' et '/tmp/nomodifs'"
liste des fichiers modifiés ou pas dans '/tmp/modifs' et '/tmp/nomodifs'
iznobe@iznobe-PC:~/Scripts/teste$ echo ""

iznobe@iznobe-PC:~/Scripts/teste$ if [[ $Long > 0 ]]; then echo "vous avez $Long répertoires de taille importante. Voir le détail dans /tmp/LongFic" ; fi
iznobe@iznobe-PC:~/Scripts/teste$ 
iznobe@iznobe-PC:~/Scripts/teste$ echo "pour supprimer les dossiers vides , copiez collez la commande suivante : for i in **/*; do find . -type d -empty -print -delete ; done"
pour supprimer les dossiers vides , copiez collez la commande suivante : for i in **/*; do find . -type d -empty -print -delete ; done
iznobe@iznobe-PC:~/Scripts/teste$

Dernière modification par iznobe (Le 28/12/2021, à 14:35)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM . avec Ubuntu , LM et W$10

Hors ligne

#32 Le 28/12/2021, à 14:41

iznobe

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

geole a écrit :

il  ne traite pas...

shopt -s globstar
modif_activ=rue;

=>

modif_activ=true

Dernière modification par iznobe (Le 28/12/2021, à 14:42)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM . avec Ubuntu , LM et W$10

Hors ligne

#33 Le 28/12/2021, à 15:57

iznobe

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

avec ce code :

# $i = nom complet rep ou fichier original
# $i1 = chemin relatif du repertoire original
# $j = nom complet rep ou fichier modifié
# $j1 = chemin relatif du repertoire modifié
# $j2 = nom dernier argument modifié

shopt -s globstar
modif_activ=rue;

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

Long=0; Nbrep=0; Nbfilemodified=0; Nbrepmodified=0; NbfileNOTmodified=0; Debut=$(echo $(date +%s));
echo "liste des fichiers n ' ayant pas pu etre modifiés :" > /tmp/nomodifs
echo "-------------------" > /tmp/modifs

for i in **/*; do
    Nbrep=$(($Nbrep+1))
    # traitement des espaces    
    j=$( echo $i | sed 's@ */ *@/@g' )

    # remplacement d'un maxima de caractères interdits par windows ><\:"|?*
    j=$( echo "$j"  | tr '><"|?*:\\' '!!!!!!!%' ) # echappement de "\" par le meme signe donc 2 \\ pour qu un soit remplacé 

    # Vérifions si le nom n'est pas interdit. Récupération du dernier argument
    j2=$( echo "$j" | grep -o '[^/]*$' )
    #if [[ "${Exclus[@]}" =~  "$j2"  ]]; then j=$(echo "$j""_") ; echo "$j" ; fi
    for t in "${Exclus[@]}"; do
       if [[ "$t" =  "$j2"  ]]; then j="$j""_" ; fi
    done

    # Vérifions si la longueur n'est pas excessive
    if [[ "${#j2}" -ge   248 || "${#j}"  -ge 32384 ]] ; then
        if [[ "$long" -eq 0 ]]; then echo "[url]https://www.pcastuces.com/pratique/astuces[/url]" > /tmp/LongFic ; fi
        Long=$(($Long+1))
        echo "$Long : $j" >> /tmp/LongFic
    fi

    if [[ "$i" != "$j" ]]; then # si il y a un changement a effectuer
    #diff <(echo $i) <(echo $j)
    
        if test -d "$i" ; then # si c' est un dossier
            if test -e "$j" ; then # on verifie si il existe un dossier du meme nom avant de renommer
                # si deja un dossier du meme nom , on stocke l' erreur
                NbfileNOTmodified=$(($NbfileNOTmodified+1))
                echo "$Nbrep un dossier du meme nom existe deja :'$j' impossible de renommer '$i'" >> /tmp/nomodifs
            else # si pas de dossier du meme nom , on renomme
            echo "on va renommer ce répertoire avec la commande suivante : mkdir '$j'"
                if [ "$modif_activ" = true ] ; then
                    mkdir "$j"
                    if test -e "$j" ; then # si la creation du repertoire a reussi
                        # enregistrement des changements
                        echo "$Nbrep CREERREP : mkdir '$j'" >> /tmp/modifs
                        Nbrepmodified=$(($Nbrepmodified+1))
                        # on deplace tout le contenu de l' ancien repertoire dans le nouveau
                        # creer une fonction de la boucle et l' appeler ici a la place .
                        # for x in $i; do
                            # echo "mv $x $j" >> /tmp/modifs
                        # done
                        # echo "rmdir $i" >> /tmp/modifs
                        
                    else
                        NbfileNOTmodified=$(($NbfileNOTmodified+1))
                        echo "$Nbrep erreur inconnue pour repertoire : '$i'" >> /tmp/nomodifs
                    fi
                fi
            fi
        elif test -f "$i" ; then # si c est un fichier
            # on verifie si il existe un fichier du meme nom avant de renommer
            if test -e "$j" ; then # si deja un fichier du meme nom , on stocke l' erreur
                NbfileNOTmodified=$(($NbfileNOTmodified+1))
                echo "$Nbrep un fichier du meme nom existe deja :\'$j\' impossible de renommer \'$i\'" >> /tmp/nomodifs
            else # si pas de fichier du meme nom , on renomme
                # chemin relatif du repertoire original
                i1=$(echo "$i" | rev | cut -d/  --complement -s -f1 | rev)
                # Récupérons le chemin apres modif 
                j1=$(echo "$j" | rev | cut -d/  --complement -s -f1 | rev) # donne le chemin relatif du repertoire modifié .
                if [[ "$i1" != "$j1" ]]; then # si les chemins sont differents , c' est que l' arborescence a été modifiée :
                    # dans ce cas on utilise l' arborescence modifiée precedemment + le nom modifié du dernier argument pour la destination
                    j=$(echo "$j1/$j2")
                else # sinon il suffit de ne pas tenir compte de l' arboresecence puisqu ' elle est identique
                    # recuperation nom original du dernier argument
                    i=$(echo "$i" | grep -o '[^/]*$' ) # on utilise juste le nom de fichier original pour la src
                    j=$(echo "$j" | grep -o '[^/]*$' ) # on utilise que le nom du fichier modifié pour la destination 
                fi
                echo "on va renommer ce fichier avec la commande suivante : mv '$i'  '$j'"
                if [ "$modif_activ" = true ] ; then
                    mv "$i" "$j"
                    # puis on verifie que le fichier renommé existe bien :
                    if test -e "$j" ; then # si le fichier existe on incremente
                        # enregistrement des changements
                        echo "$Nbrep RENOM : mv '$i' en : '$j'" >> /tmp/modifs
                        Nbfilemodified=$(($Nbfilemodified+1))
                    else # sinon => erreur
                        NbfileNOTmodified=$(($NbfileNOTmodified+1))
                        echo "$Nbrep erreur inconnue pour fichier : '$i'" >> /tmp/nomodifs
                    fi
                fi
            fi
        else # sinon => erreur
            NbfileNOTmodified=$(($NbfileNOTmodified+1))
            echo "$Nbrep erreur inconnue pour : '$i'" >> /tmp/nomodifs
        fi
    fi

done
echo ""
echo "$Nbrep répertoires et fichiers traités, $Nbrepmodified répertoires modifiés, $Nbfilemodified fichiers modifiés, $NbfileNOTmodified répertoires et fichiers n ' ayant pas pu etre modifiés en $(($(date +%s)-$Debut)) secondes."
echo ""
echo "liste des fichiers modifiés ou pas dans '/tmp/modifs' et '/tmp/nomodifs'"
echo ""
if [[ "$Long" > 0 ]]; then echo "vous avez $Long répertoires de taille importante. Voir le détail dans /tmp/LongFic" ; fi

echo "pour supprimer les dossiers vides , copiez collez la commande suivante : for i in **/*; do find . -type d -empty -print -delete ; done"

ca a l ' air de maintenant fonctionné normalement .

certaines conditions etaient ecrites sous la forme

if  $x

au lieu de

if  "$x"

ce qui mettait le binzz wink
---------------------------------------------------------------------------------------------------------------------------
resultat d' une simulation avec le script ci-dessus sur mon repertoire personnel script :

iznobe@iznobe-PC:~/Scripts/teste$ cd .. && ./test.sh
on va renommer ce fichier avec la commande suivante : mv 'script conformité  noms samba final.sh'  'script conformité noms samba final.sh'
on va renommer ce fichier avec la commande suivante : mv 'Nouveau [doc      ument]   '  'Nouveau [doc ument]'

27645 répertoires et fichiers traités, 0 répertoires modifiés, 0 fichiers modifiés, 0 répertoires et fichiers n ' ayant pas pu etre modifiés en 302 secondes.

liste des fichiers modifiés ou pas dans '/tmp/modifs' et '/tmp/nomodifs'

pour supprimer les dossiers vides , copiez collez la commande suivante : for i in **/*; do find . -type d -empty -print -delete ; done
iznobe@iznobe-PC:~/Scripts$

je vais lancer une simulation sur mon repertoire perso , ca risque de prendre un peu de temps ...

EDIT , en fait non tongue , le script ne suit pas les liens symboliques !

Dernière modification par iznobe (Le 28/12/2021, à 16:35)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM . avec Ubuntu , LM et W$10

Hors ligne

#34 Le 28/12/2021, à 17:57

geole

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

geole a écrit :

Tu avais signalé des problèmes pour les fichiers avec des  [  et des  ]

Le problème semble après, il veut encore renommer....

Idée 2, on ne fait jamais  le test et on récupère les erreurs de l'exécution s'il y en a....

J'ai actualisé pour filtrer les erreurs d'exécution.

Je viens d'exécuter ton script.  Les modifications sont bien faites

Dernière modification par geole (Le 28/12/2021, à 17:58)

Hors ligne

#35 Le 28/12/2021, à 18:24

geole

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

Tu as toujours cette commande

            echo "on va renommer ce répertoire avec la commande suivante : mkdir '$j'"
                    mkdir "$j"
                        echo "$Nbrep CREERREP : mkdir '$j'" >> /tmp/modifs

Ou alors, il faut plus de choses: exécuter la commande que tu as prévue

a@a:~/TEST$ for i in **/*; do find . -type d -empty -print -delete ; done
./[ REP ##### ]/[ REP ##### ] BBBB/[ REP ##### ] BBBB EEEE
./   [     REP  #####   ]    /   [     REP  #####   ]    BBBB   /   [     REP  #####   ]    BBBB   EEEE
./   [     REP  #####   ]    /   [     REP  #####   ]    BBBB   
./   [     REP  #####   ]    
a@a:~/TEST$ 
for i in **/*; do find . -type d -empty -print -delete ; done

Un résultat montre que l'ancien répertoire est toujours présent

0 -rw-rw-r-- 1 a a    0 déc.  28 17:12 '[ FIC DRA]'
4 -rwxrwxr-x 1 a a 2434 déc.  28 16:46  MonScript
4 drwxrwxr-x 3 a a 4096 déc.  28 17:13 '   [     REP  #####   ]    '
4 drwxrwxr-x 3 a a 4096 déc.  28 17:13 '[ REP ##### ]'
8 -rwxrwxr-x 1 a a 6905 déc.  28 16:50  script
a@a:~/TEST$ 

Avec tous ses anciens répertoires

a@a:~/TEST/   [     REP  #####   ]    $ ls -als
total 12
4 drwxrwxr-x 3 a a 4096 déc.  28 17:13  .
4 drwxrwxr-x 4 a a 4096 déc.  28 17:13  ..
4 drwxrwxr-x 3 a a 4096 déc.  28 17:13 '   [     REP  #####   ]    BBBB   '
a@a:~/TEST/   [     REP  #####   ]    $ ls -Rals
.:
total 12
4 drwxrwxr-x 3 a a 4096 déc.  28 17:13  .
4 drwxrwxr-x 4 a a 4096 déc.  28 17:13  ..
4 drwxrwxr-x 3 a a 4096 déc.  28 17:13 '   [     REP  #####   ]    BBBB   '

'./   [     REP  #####   ]    BBBB   ':
total 12
4 drwxrwxr-x 3 a a 4096 déc.  28 17:13  .
4 drwxrwxr-x 3 a a 4096 déc.  28 17:13  ..
4 drwxrwxr-x 2 a a 4096 déc.  28 17:13 '   [     REP  #####   ]    BBBB   EEEE'

'./   [     REP  #####   ]    BBBB   /   [     REP  #####   ]    BBBB   EEEE':
total 8
4 drwxrwxr-x 2 a a 4096 déc.  28 17:13 .
4 drwxrwxr-x 3 a a 4096 déc.  28 17:13 ..
a@a:~/TEST/   [     REP  #####   ]    $ 

Dernière modification par geole (Le 28/12/2021, à 18:25)

Hors ligne

#36 Le 29/12/2021, à 11:11

iznobe

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

Bonjour , je pense que je vais rester sur la version avec la commande pour enlever les dossiers vides manuellement , ca semble d ' une part plus sur et plus judicieux car pas le temps ni la connaissance de faire mieux avec ce script .

En l ' etat , il a quand meme bien evoluer et est relativement performant .
j ' ai bien conscience qu ' il est possible de faire bien mieux que ca , mais bon ...

je vais passer en reolu donc , et faire du nettoyage dans  les messages .
j ' espere que ce script pourra servir aussi a d ' autres .

Bonnes fetes de fin d' année a tous et merci @geole pour ton aide precieuse wink ainsi que @watael et @MicP et @kamaris !

Dernière modification par iznobe (Le 29/12/2021, à 14:33)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM . avec Ubuntu , LM et W$10

Hors ligne

#37 Le 29/12/2021, à 14:29

iznobe

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

Bonjour , finalement je remodifie une dernier fois le script final afin de supprimer la boucle for , pour les fichiers exclus , la solution etant donnée par

kamaris a écrit :
if [[ " ${Exclus[*]} " ==  *" $j "*  ]]; then j+=_ ; fi

(j'ai aussi remplacé j2 par j, peut-être ne faut-il pas…)

que je remercie pour son intervention !


Pour activer les modifications , n' oubliez pas de mettre :

modif_activ=true

Voici donc le code final :

shopt -s globstar
modif_activ= rue;

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

Long=0; Nbrep=0; Nbfilemodified=0; Nbrepmodified=0; NbfileNOTmodified=0; Debut=$(echo $(date +%s));
echo "liste des fichiers n ' ayant pas pu etre modifiés :" > /tmp/nomodifs
echo "-------------------" > /tmp/modifs

for i in **/*; do
    Nbrep=$(($Nbrep+1))
    # traitement des espaces    
    j=$( echo $i | sed 's@ */ *@/@g' )

    # remplacement d'un maxima de caractères interdits par windows ><\:"|?*
    j=$( echo "$j"  | tr '><"|?*:\\' '!!!!!!!%' ) # echappement de "\" par le meme signe donc 2 \\ pour qu un soit remplacé 

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

    # Vérifions si la longueur n'est pas excessive
    if [[ "${#j2}" -ge   248 || "${#j}"  -ge 32384 ]] ; then
        if [[ "$long" -eq 0 ]]; then echo "[url]https://www.pcastuces.com/pratique/astuces[/url]" > /tmp/LongFic ; fi
        Long=$(($Long+1))
        echo "$Long : $j" >> /tmp/LongFic
    fi

    if [[ "$i" != "$j" ]]; then # si il y a un changement a effectuer
    
        if test -d "$i" ; then # si c' est un dossier
            if test -e "$j" ; then # on verifie si il existe un dossier du meme nom avant de renommer
                # si deja un dossier du meme nom , on stocke l' erreur
                NbfileNOTmodified=$(($NbfileNOTmodified+1))
                echo "$Nbrep un dossier du meme nom existe deja :'$j' impossible de renommer '$i'" >> /tmp/nomodifs
            else # si pas de dossier du meme nom , on renomme
            echo "on va renommer le répertoire '$i' avec la commande suivante : mkdir '$j'"
                if [ "$modif_activ" = true ] ; then
                    mkdir "$j"
                    if test -e "$j" ; then # si la creation du repertoire a reussi
                        # enregistrement des changements
                        echo "$Nbrep CREERREP : mkdir '$j'" >> /tmp/modifs
                        Nbrepmodified=$(($Nbrepmodified+1))                        
                    else
                        NbfileNOTmodified=$(($NbfileNOTmodified+1))
                        echo "$Nbrep erreur inconnue pour repertoire : '$i'" >> /tmp/nomodifs
                    fi
                fi
            fi
        elif test -f "$i" ; then # si c est un fichier
            # on verifie si il existe un fichier du meme nom avant de renommer
            if test -e "$j" ; then # si deja un fichier du meme nom , on stocke l' erreur
                NbfileNOTmodified=$(($NbfileNOTmodified+1))
                echo "$Nbrep un fichier du meme nom existe deja :\'$j\' impossible de renommer \'$i\'" >> /tmp/nomodifs
            else # si pas de fichier du meme nom , on renomme
                # chemin relatif du repertoire original
                i1=$(echo "$i" | rev | cut -d/  --complement -s -f1 | rev)
                # Récupérons le chemin apres modif 
                j1=$(echo "$j" | rev | cut -d/  --complement -s -f1 | rev) # donne le chemin relatif du repertoire modifié .
                if [[ "$i1" != "$j1" ]]; then # si les chemins sont differents , c' est que l' arborescence a été modifiée :
                    # dans ce cas on utilise l' arborescence modifiée precedemment + le nom modifié du dernier argument pour la destination
                    j=$(echo "$j1/$j2") 
                fi
                echo "on va renommer ce fichier avec la commande suivante : mv '$i' => '$j'"
                if [ "$modif_activ" = true ] ; then
                    mv "$i" "$j"
                    # puis on verifie que le fichier renommé existe bien :
                    if test -e "$j" ; then # si le fichier existe on incremente
                        # enregistrement des changements
                        echo "$Nbrep RENOM : mv '$i' en : '$j'" >> /tmp/modifs
                        Nbfilemodified=$(($Nbfilemodified+1))
                    else # sinon => erreur
                        NbfileNOTmodified=$(($NbfileNOTmodified+1))
                        echo "$Nbrep erreur inconnue pour fichier : '$i'" >> /tmp/nomodifs
                    fi
                fi
            fi
        else # sinon => erreur
            NbfileNOTmodified=$(($NbfileNOTmodified+1))
            echo "$Nbrep erreur inconnue pour : '$i'" >> /tmp/nomodifs
        fi
    fi

done

echo ""
echo "$Nbrep répertoires et fichiers traités, $Nbrepmodified répertoires modifiés, $Nbfilemodified fichiers modifiés, $NbfileNOTmodified répertoires et fichiers n ' ayant pas pu etre modifiés en $(($(date +%s)-$Debut)) secondes."
echo ""
echo "liste des fichiers modifiés ou pas dans '/tmp/modifs' et '/tmp/nomodifs'"
echo ""
if [[ "$Long" > 0 ]]; then echo "vous avez $Long répertoires de taille importante. Voir le détail dans /tmp/LongFic" ; fi

echo "pour supprimer les dossiers vides , copiez collez la commande suivante : find -type d -empty -delete"

EDIT : Merci donc aussi @Coeur noir et @nany pour la suppression de la boucle dans la suppresion des dossiers vides

Dernière modification par iznobe (Le 10/02/2022, à 09:53)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM . avec Ubuntu , LM et W$10

Hors ligne

#38 Le 20/01/2022, à 22:42

Coeur Noir

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

geole a écrit :
Coeur Noir a écrit :

Doit bien y avoir moyen de demander à Samba de n'accepter que des noms de fichiers/dossiers compatibles Win ?

Bonjour
Il faut monter le répertoire avec l'option windows_names

D'une part je supposais que c'était déjà fait.
Et d'autre part ça n'est valable que si le montage a lieu dans un système Linux. Dans ce cas c'est le pilote ntfs qui agit, pas Samba.

Iznobe c'est donc à vérifier, si le partage Samba est dans un système Linux, les options de son montage devraient inclure windows_names et pourquoi pas utf8 ou locale=fr_FR.UTF-8 ça devrait limiter la possibilité de produire des noms de fichiers incompatibles Windows.


DébuterDocBien rédigerRetour commandeInsérer image | illustrations & captures d'écran <>

Hors ligne

#39 Le 21/01/2022, à 00:59

iznobe

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

Bonjour  @Coeur Noir ,

Coeur Noir a écrit :

D'une part je supposais que c'était déjà fait.
Et d'autre part ça n'est valable que si le montage a lieu dans un système Linux

le montage du  dossier partagé ? ou bien dans les options de conf de samba ?

Mon serveur samba est sur ubuntu , par contre le montage des dossiers qu il partage , se font sous windows , sous android ou sous ubuntu selon les besoins .
Si j ' ai bien compris , du coup ca limite l' interet de cette option ?

En l ' occurence , grace a l' entraide des gens sur ce forum , on a pu tout de meme creer ce script qui permet de resoudre le soucis une bonne fois pour toute et pour tout les OS ( a part MAC ) vu que windows est me semble t il le plus restrictif en caracteres interdit .

Depuis a partir d' ordi windows ou android , je n' ai pour l' instant plus trouver de nom qui cloche .
Ce script permet aussi d' enlever les espaces en debut et fin de noms de fichiers , il est relativement rapide meme si il est certainement encore possible de l' ameliorer .

D ' apres mes tests , il permet de logguer les changements et donc de reperer facilement les bugs , meme sans faire rellement les changements .
Je le trouve tres pratique et remercie tous ceux qui ont participés a son elaboration wink

Dernière modification par iznobe (Le 21/01/2022, à 01:01)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM . avec Ubuntu , LM et W$10

Hors ligne