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.

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

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.

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 utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

En 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ésolu] 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 cool

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


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

N'oubliez pas de sauvegarder vos fichiers avant d'essayer en réel, des fois que ça ferait des bêtises, on sait jamais. tongue


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

Pour réellement renommer les fichiers :

./test.sh /home/hotnuma/Test/files true

Vla tongue


Xubuntu / GitHub

Hors ligne

#16 Le 08/04/2023, à 11:38

iznobe

Re : (Résolu) Modifier les noms de répertoires et fichiers.

xubu1957 a écrit :

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 utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

En 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 smile
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.

hotnuma a écrit :
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. smile


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 tongue J'ai dû faire la même chose dans plusieurs scripts, je corrigerai. Merci. tongue

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