#26 Le 27/12/2021, à 20:09
- iznobe
Re : [RESOLU] script mettre en conformité les noms de fichiers samba
Bonjour geole et merci pour la correction 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
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, à 20:22)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#27 Le 28/12/2021, à 02: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
Dernière modification par iznobe (Le 29/12/2021, à 13:30)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#28 Le 28/12/2021, à 12:10
- geole
Re : [RESOLU] script mettre en conformité les noms de fichiers samba
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, à 12:11)
Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit, utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248
Hors ligne
#29 Le 28/12/2021, à 12: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
Dernière modification par iznobe (Le 28/12/2021, à 13:59)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#30 Le 28/12/2021, à 12: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, à 13:05)
Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit, utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248
Hors ligne
#31 Le 28/12/2021, à 13: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, à 13:35)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#32 Le 28/12/2021, à 13:41
- iznobe
Re : [RESOLU] script mettre en conformité les noms de fichiers samba
il ne traite pas...
shopt -s globstar
modif_activ=rue;
=>
modif_activ=true
Dernière modification par iznobe (Le 28/12/2021, à 13:42)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#33 Le 28/12/2021, à 14: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
---------------------------------------------------------------------------------------------------------------------------
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 , le script ne suit pas les liens symboliques !
Dernière modification par iznobe (Le 28/12/2021, à 15:35)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#34 Le 28/12/2021, à 16:57
- 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 ]
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, à 16:58)
Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit, utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248
Hors ligne
#35 Le 28/12/2021, à 17: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, à 17:25)
Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit, utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248
Hors ligne
#36 Le 29/12/2021, à 10: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 ainsi que @watael et @MicP et @kamaris !
Dernière modification par iznobe (Le 29/12/2021, à 13:33)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#37 Le 29/12/2021, à 13: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
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, à 08:53)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#38 Le 20/01/2022, à 21:42
- Coeur Noir
Re : [RESOLU] script mettre en conformité les noms de fichiers samba
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ébuter ⋅ Doc ⋅ Bien rédiger ⋅ Retour commande ⋅ Insérer image | illustrations & captures d'écran < ⋅ >
Hors ligne
#39 Le 20/01/2022, à 23:59
- iznobe
Re : [RESOLU] script mettre en conformité les noms de fichiers samba
Bonjour @Coeur Noir ,
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
Dernière modification par iznobe (Le 21/01/2022, à 00:01)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne