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 Hier à 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 (Hier à 00:12)

Hors ligne

#54 Hier à 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 (Hier à 00:49)

Hors ligne