#1 Le 07/04/2023, à 18:53
- Compte supprimé
(Résolu) Modifier les noms de répertoires et fichiers.
Bonjour,
Je voudrais corriger les noms des sous-répertoires et fichiers de la totalité d'un répertoire.
Il s'agit de trouver les noms incorrects et remplacer les espaces par des "_" et les lettres accentuées par des non accentuées.
Savez-vous s'il existe un outil graphique pour automatiser cela ou si c'est faisable en ligne de commande.
Résolu avec l'aide de trois solutions selon le problème : le script de hotnuma, krename et le renommage manuel
Dernière modification par Compte supprimé (Le 09/04/2023, à 08:07)
#2 Le 07/04/2023, à 19:18
- jplemoine
Re : (Résolu) Modifier les noms de répertoires et fichiers.
Ca doit être possible en ligne de commande.
Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.
Déconnecté jusqu’à nouvel ordre
Hors ligne
#3 Le 07/04/2023, à 19:34
- iznobe
Re : (Résolu) Modifier les noms de répertoires et fichiers.
Salut , avec geole ( et pas mal d' autres intervenants habitués du forum ) on avait fait un " script " qui permet de renommer avec pas mal de commandes differentes dont les espaces et le remplacement de caracteres non desirés , le voici :
# $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é
# temps exactement identique pour l' ecriture : if test -e "$i" ou [[ -e "$i"]]
shopt -s globstar
modif_activ=true;
###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"
tu peux probablement en tirer quelquechose de pas trop mal en l' arrengeant a ta convenance .
si tu as des question sur son fonctionnement ou autre , je peux probablement te renseigner .
il ya aussi une discussion dediée , faut que je retrouve le lien , si ca t' interresse de l' avoir dis le .
PS : en mettant autre chose que " true " a :
modif_activ=true;
cela fait une simple simulation .
Dernière modification par iznobe (Le 07/04/2023, à 19:40)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#4 Le 07/04/2023, à 19:54
- Compte supprimé
Re : (Résolu) Modifier les noms de répertoires et fichiers.
Merci, c'est une piste.
Mais que fait la première commande ? shopt -s globstar
Il y a quelque chose à installer ?
Vu
Dernière modification par Compte supprimé (Le 07/04/2023, à 20:01)
#5 Le 07/04/2023, à 20:00
- xubu1957
Re : (Résolu) Modifier les noms de répertoires et fichiers.
Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [Réso|u] lorsque ceux-ci le sont, au début du titre en cliquant sur Modifier sous le premier message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci. Membre de Linux-Azur
Hors ligne
#6 Le 07/04/2023, à 20:09
- Compte supprimé
Re : (Résolu) Modifier les noms de répertoires et fichiers.
J'arrive à l'exécuter, mais il ne semble pas supprimer les espaces.
Un test sur un répertoire de photos de fleurs donne :
on va renommer ce fichier avec la commande suivante : mv 'Fleurs_Lavandula °1.JPG' => 'Fleurs_Lavandula °1.JPG'
Dernière modification par Compte supprimé (Le 07/04/2023, à 20:11)
#7 Le 07/04/2023, à 20:29
- geole
Re : (Résolu) Modifier les noms de répertoires et fichiers.
Bonsoir.
Je crois que le script remplace plusieurs espaces consécutifs par un seul espace, il aurait peut-être du remplacer par le seul caractère _
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
#8 Le 07/04/2023, à 20:43
- Compte supprimé
Re : (Résolu) Modifier les noms de répertoires et fichiers.
As-tu une idée de la façon dont on peut arranger cela ?
#9 Le 07/04/2023, à 20:52
- geole
Re : (Résolu) Modifier les noms de répertoires et fichiers.
Dans ton exemple , il me semble qu'il y avait deux espaces dans le nom du fichier entrée et qu'il n'y en a plus qu'un seul dans le fichier sortie.
Pour y accéder en ligne de commande il faut l'encadrer par le caractére ´ ou le caractére "
Cela ne semble pas insurmontable, Sinon il faudrait modifier le script pour dire de remplacer les espaces par des underscore. Cela ne devrait pas être difficille.
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
#10 Le 08/04/2023, à 09:34
- Compte supprimé
Re : (Résolu) Modifier les noms de répertoires et fichiers.
Oui, il me reste à apprendre à utiliser sed
Dernière modification par Compte supprimé (Le 08/04/2023, à 09:34)
#11 Le 08/04/2023, à 09:40
- hotnuma
Re : (Résolu) Modifier les noms de répertoires et fichiers.
Pour remplacer les espaces :
https://stackoverflow.com/questions/19661267/
a="hello world"
echo ${a// /_}
Resultat :
hello_world
Xubuntu / GitHub
Hors ligne
#12 Le 08/04/2023, à 10:01
- hotnuma
Re : (Résolu) Modifier les noms de répertoires et fichiers.
Pour enlever les accents et remplacer les espaces :
#!/usr/bin/bash
dirpath="$1"
for filepath in "$dirpath"/*
do
if test -f "$filepath"; then
newpath=$(echo $filepath | iconv -f UTF-8 -t ASCII//TRANSLIT)
newpath="${newpath// /_}"
echo "* $filepath"
if [[ "$filepath" != "$newpath" ]]; then
echo "rename $filepath > $newpath"
fi
fi
done
Exemple :
./test.sh /home/hotnuma/Test/files
Résultat :
* /home/hotnuma/Test/files/é è à.txt
rename /home/hotnuma/Test/files/é è à.txt > /home/hotnuma/Test/files/e_e_a.txt
Cet exemple ne renomme rien pour l'instant, il faudrait tester la valeur de retour de la commande iconv pour être sûr que la conversion a réussi.
Vla une ébauche de script.
Xubuntu / GitHub
Hors ligne
#13 Le 08/04/2023, à 10:31
- Compte supprimé
Re : (Résolu) Modifier les noms de répertoires et fichiers.
Cet exemple ne renomme rien pour l'instant, il faudrait tester la valeur de retour de la commande iconv pour être sûr que la conversion a réussi.
Merci pour cela.
J'ai fait tourner le script. Comment tester le résultat ? En tout cas ce qui est affiché en retour est parfait, il enlève aussi les û de Août.
Dernière modification par Compte supprimé (Le 08/04/2023, à 10:33)
#14 Le 08/04/2023, à 11:10
- hotnuma
Re : (Résolu) Modifier les noms de répertoires et fichiers.
Voila une nouvelle version qui devrait tester la conversion :
#!/usr/bin/bash
BASEDIR="$(dirname -- "$(readlink -f -- "$0";)")"
OUTFILE="$BASEDIR/result.log"
rm -f "$OUTFILE"
dirpath="$1"
for filepath in "$dirpath"/*
do
if [[ -f "$filepath" ]]; then
newpath=$(echo $filepath | iconv -f UTF-8 -t ASCII//TRANSLIT)
if [[ $? != 0 ]]; then
echo "iconv error > $filepath" 2>&1 | tee -a "$OUTFILE"
continue
fi
newpath="${newpath// /_}"
if [[ "$filepath" != "$newpath" ]]; then
echo "* $filepath" 2>&1 | tee -a "$OUTFILE"
if [[ -f "$newpath" ]]; then
echo "file exists $newpath" 2>&1 | tee -a "$OUTFILE"
else
echo "rename $filepath > $newpath" 2>&1 | tee -a "$OUTFILE"
#mv "$filepath" "$newpath"
fi
fi
fi
done
On doit obtenir un fichier result.log dans le même dossier que le script.
Il faut maintenant ajouter une option pour réellement renommer les fichiers.
N'oubliez pas de sauvegarder vos fichiers avant d'essayer en réel, des fois que ça ferait des bêtises, on sait jamais.
Xubuntu / GitHub
Hors ligne
#15 Le 08/04/2023, à 11:37
- hotnuma
Re : (Résolu) Modifier les noms de répertoires et fichiers.
Nouvelle version qui permet de tester ou renommer :
#!/usr/bin/bash
BASEDIR="$(dirname -- "$(readlink -f -- "$0";)")"
OUTFILE="$BASEDIR/result.log"
rm -f "$OUTFILE"
dirpath="$1"
rename="$2"
if ! [[ -d $dirpath ]]; then
echo "*** invalid directory > $dirpath" 2>&1 | tee -a "$OUTFILE"
exit 1
fi
for filepath in "$dirpath"/*
do
if [[ -f "$filepath" ]]; then
newpath=$(echo $filepath | iconv -f UTF-8 -t ASCII//TRANSLIT)
if [[ $? != 0 ]]; then
echo "*** iconv error > $filepath" 2>&1 | tee -a "$OUTFILE"
continue
fi
newpath="${newpath// /_}"
if [[ "$filepath" != "$newpath" ]]; then
echo "* $filepath" 2>&1 | tee -a "$OUTFILE"
if [[ -f "$newpath" ]]; then
echo "file exists $newpath" 2>&1 | tee -a "$OUTFILE"
else
echo "rename $filepath > $newpath" 2>&1 | tee -a "$OUTFILE"
if [[ $rename == "true" ]]; then
mv "$filepath" "$newpath" 2>&1 | tee -a "$OUTFILE"
fi
fi
fi
fi
done
Pour tester :
./test.sh /home/hotnuma/Test/files
Etre bien sûr d'avoir une sauvegarde des fichiers en cas problème.
Pour réellement renommer les fichiers :
./test.sh /home/hotnuma/Test/files true
Vla
Xubuntu / GitHub
Hors ligne
#16 Le 08/04/2023, à 11:38
- iznobe
Re : (Résolu) Modifier les noms de répertoires et fichiers.
Salut xubu1959 , c ' est bien ca .
On voit dans cette conversation ( au tout debut ) , une intervention de @erresse qui stipule que inviska rename peut faire ce genre de chose graphiquement .
il y a aussi thunar rename inclus dans xfce que j' utilise tres souvent .
Dernière modification par iznobe (Le 08/04/2023, à 11:41)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#17 Le 08/04/2023, à 12:29
- Compte supprimé
Re : (Résolu) Modifier les noms de répertoires et fichiers.
Merci pour vos contributions.
J'ai aussi essayé avec succès krename qui permet de faire "rechercher et remplacer" sur tous les caractères que l'on veut.
Dernière modification par Compte supprimé (Le 09/04/2023, à 08:07)
#18 Le 09/04/2023, à 08:10
- Compte supprimé
Re : (Résolu) Modifier les noms de répertoires et fichiers.
@hotnuma
Ton script fonctionne très bien, encore merci
Pour améliorer :
* il ne voit pas les anomalies dans un nom qui commence par ._ (oui, il y en avait des comme cela !)
* le top serait de le rendre récursif dans les sous-dossiers
#19 Le 09/04/2023, à 14:24
- Watael
Re : (Résolu) Modifier les noms de répertoires et fichiers.
echo "*** invalid directory > $dirpath" 2>&1 | tee -a "$OUTFILE"
echo, par défaut, s'affiche sur la sortie standard, la redirection de la sortie d'erreur n'est pas utile :
s'il devait y avoir une erreur dans le echo, il ne fonctionnerait pas, et la redirection n'y ferait rien.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#20 Le 10/04/2023, à 00:14
- hotnuma
Re : (Résolu) Modifier les noms de répertoires et fichiers.
Exact. C'est un abus de copier-coller J'ai dû faire la même chose dans plusieurs scripts, je corrigerai. Merci.
echo "*** iconv error > $filepath" | tee -a "$OUTFILE"
Dernière modification par hotnuma (Le 10/04/2023, à 00:18)
Xubuntu / GitHub
Hors ligne
#21 Le 10/04/2023, à 13:26
- LeoMajor
Re : (Résolu) Modifier les noms de répertoires et fichiers.
Je voudrais corriger les noms des sous-répertoires et fichiers de la totalité d'un répertoire.
Il s'agit de trouver les noms incorrects et remplacer les espaces par des "_" et les lettres accentuées par des non accentuées.
Pour les fichiers perso & multi-media, tu as detox, un grand classique, simple et rapide, complémentaire à fslint, fdupes.
detox -nr ~/target
variante variable:
inline-detox <<<"@Fleurs_Lavandula(2023-[12%ù*3]) d'Hélène/Pâris 本の植物°1.JPG"
Fleurs_Lavandula-2023-12%u_3-d_Helene_Paris_1.JPG
~$ for c in /usr/share/fslint/fslint/*; do if [ -f "$c" ]; then echo -e "\n----${c##*/}----"; grep "${c##*/}" "$c"; fi; done
----findbl----
# findbl - find bad symbolic links (dangling, malformed etc.)
findbl \$(getffl)"
----finded----
# finded - find empty directory branches
----findid----
# findid - find invalid user ids
----findnl----
# findnl - find problematic filenames
----findns----
# findns - find non stripped executables
----findrs----
# findrs - find files that have lines with trailing whitespace
----findsn----
# findsn - find duplicate names in the specified tree(s).
----findtf----
# findtf - find temporary files
For e.g. findtf -c --age=4 only reports core files over 4 days old.
----findu8----
# findu8 - find files with invalid utf8 names
----findul----
----findup----
# findup - find duplicate files
findup or findup .
findup -m /usr/src/linux*
findup -r .
findup /usr/bin
findup -r /usr/bin /bin /usr/sbin /sbin
findup \$("$script_dir"/supprt/getffp)
findup / -size +100k
findup ~ -user \$(id -u)
findup / -user \$(id -u roger)"
----fslint----
# fslint - FSlint command line utilites wrapper
----zipdir----
# zipdir - shrink specified directories.
Hors ligne