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 22/03/2011, à 16:50

yirkkiller

Renommage de masse [RESOLU]

Bonjour,

Je souhaiterais renommer en masse des fichiers.

J'ai donc un dossier Slides qui contient le titre de la présentation (formaté par mes soins  sous la forme PresentationSecurite par exemple). Chaque dossier contient Seminaire01, Seminaire02, etc...

Presentations
|___PresentationSecurite
       |___Seminaire01
              |___Fichier1
              |___Fichier2
              |___Fichier3
       |___Seminaire02
              |___Fichier1
              |___Fichier2
              |___Fichier3
|___PresentationInformatique
       |___Seminaire01
              |___Fichier1
              |___Fichier2
              |___Fichier3
       |___Seminaire02
              |___Fichier1
              |___Fichier2
              |___Fichier3
...

Les fichiers sont par contre dans un bordel monstrueux.

Est-il possible d'extraire le nom de la présentation à partir du dossier (PresentationSecurite par exemple), le numéro de la présentation (Seminaire01) à partir du dossier aussi, et d'extraire le numéro du fichier à partir du nom du fichier (chaque nom de fichier contient p1s3 pour le troisième fichier du séminaire 01 par exemple), pour le renommer sous la forme :

NomPresentation-Seminaire01-Fichier03.ppt

Merci !

Dernière modification par yirkkiller (Le 29/03/2011, à 09:25)

Hors ligne

#2 Le 22/03/2011, à 21:45

WW

Re : Renommage de masse [RESOLU]

Salut @yirkkiller,

  L'utilitaire "Renommer de masse" de Thunar (XFCE), devrait parfaitement remplir ton besoin.

Sinon des boucles for et des regex du genre :
for pres in `ls Presentation*` do
  cd $pres
  for sem in `ls Seminaire*` do
      for file in `ls p*s*` do
        $i=~/p\ds(\d+)/
        mv $i $pres-$sem-Fichier$1.ptt
      done
  done
  cd ..
done

Dis moi si "Renommer en masse" ne te convient pas.


Quand on sait c'est facile, mais qui n'a jamais été débutant.

Hors ligne

#3 Le 22/03/2011, à 21:51

Hizoka

Re : Renommage de masse [RESOLU]

il y a krename ou meme metamorphose2

pas franchement la peine de se prendre la tete avec des boucles et autres alors qu'il existe pleins de logiciels pour ça...


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#4 Le 23/03/2011, à 17:57

yirkkiller

Re : Renommage de masse [RESOLU]

Bonjour,

Je n'ai pas encore essayé les logiciels, mais il y a une erreur de script :

./renommer.sh: ligne 2: Erreur de syntaxe près du symbole inattendu « cd »
./renommer.sh: ligne 2: `  cd $pres'

De plus, je n'arrive pas à comprendre la ligne

$i=~/p\ds(\d+)/

Pouvez-vous m'expliquer svp ?

Merci !

Hors ligne

#5 Le 23/03/2011, à 21:47

WW

Re : Renommage de masse [RESOLU]

Salut,

  Apparemment tu t'interesse plus au dév, qu'au besoin final (je dirais logique vu la section smile).

Donc pour le message précédant j'ai précisé "genre" pour indiquer ressemblant. Mon algorithme était en pseudo code donc pas lançable de fait.
Pour la ligne que tu ne comprends pas est une expression régulière (regex) syntaxe Perl et autres.

=~ signifie match, est-ce que la variable vérifie les conditions de l'expression régulière.
/.../ détermine le début et fin de la regex
p...s les caractères 'p' et 's'
\d représente les digit/entiers
+ signifie au moins 1
() permet de capturer une partie ainsi si la regex est respecter $i vaut les chiffres qui suivent le caractère 's'.

Le code à proprement parlé en bash donne :

#!/bin/sh

for pres in `ls | grep Presentation`; do
  cd "$pres"
  for sem in `ls | grep Seminaire`; do
          cd "$sem"
      for file in `ls p*s*`; do
        number=`expr match "$file" 'p[0-9]*s\([0-9]*\)'`
        echo "mv $file $pres-$sem-Fichier$number.ptt"
      done
      cd ..
  done
  cd ..
done

Notes :

  • En bash les regex ne s'écrive pas comme en Perl voici les correspondances :

    1. $i=~   expr match "$file"

    2. \d   [0-9]

    3. +    * (qui signifie zero à l'infini, le + n'existant pas pour expr)

  • Une fois que tu valide la série de mv, modifie echo "mv $file $pres-$sem-Fichier$number.ptt" en mv $file $pres-$sem-Fichier$number.ptt


Quand on sait c'est facile, mais qui n'a jamais été débutant.

Hors ligne

#6 Le 23/03/2011, à 21:57

yirkkiller

Re : Renommage de masse [RESOLU]

Salut,

Merci pour tes réponses.

J'ai testé les logiciels proposés et j'ai bien apprécié Metamorphose2.

Je suis arrivé à renommer tous les fichiers sous la forme :

PresentationSecurite-Seminaire01-FichierAnciennomdufichier.ppt

Sauf que dans Ancien nom du fichier, le nom du fichier est aléatoire.

Tous contiennent soit s01f02 (pour seminaire 01 fichier 02) ou 1f2, soit S01-F02 (je sais, c'est galère).

Sauf que les logiciels ne permettent pas d'extraire ces champs facilement pour arriver à PresentationSecurite-Seminaire01-Fichier01.ppt.

As-tu une solution exploitable facilement ? Je suis admin réseaux, la dév c'est vraiment pas mon truc !!!

Ayant plus de 8000 fichiers (présentations, images, scans, logiciels...) ça devient dur à renommer un par un... si en plus le nom change...

Ne t'inquiète pas pour l'extension, aucun intérêt je me débrouillerai.

Merci beaucoup !

Hors ligne

#7 Le 24/03/2011, à 09:01

Hizoka

Re : Renommage de masse [RESOLU]

Sauf que les logiciels ne permettent pas d'extraire ces champs facilement pour arriver à PresentationSecurite-Seminaire01-Fichier01.ppt.

avec krename par ex, tu peux lui dire :
trouver et remplacer :

s0 => s
f0 => f
-f => f

et evoila comme tout utilise le meme modele et tu traite tes fichiers, ca doit être possible avec metamorphose je pense...


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#8 Le 24/03/2011, à 10:38

yirkkiller

Re : Renommage de masse [RESOLU]

Il faut savoir que dans le dossier Seminaire02, tous les fichiers contiennent forcément le numéro du séminaire dans le nom du fichier (s02f01 s02f02 pour s02 par exemple...)

Y a-t-il quelque chose à faire par rapport à ça ?

Cdt

Hors ligne

#9 Le 24/03/2011, à 15:16

yirkkiller

Re : Renommage de masse [RESOLU]

Si je ne me trompe pas, je cherche un script sous la forme :

pour chaque répertoire faire
    rep1 = nom du répertoire ;
    entrer dans le répertoire ;
    pour chaque répertoire faire
rep2 = nom du répertoire ;
        entrer dans le répertoire ;
        si  il y a des dossiers dans le répertoire alors
            pour chaque répertoire faire
                rep3 = nom du répertoire ;
                entrer dans le répertoire ;
        finsi ;
        pour chaque fichier faire
            si le fichier contient « s[0-9][0-9]f[0-9][0-9] » alors
                numero = [0-9][0-9] après « f » ;
                fonction renommer le fichier ;
            finsi ;
            si le fichier contient « [0-9]x[0-9][0-9] » alors
                numero = [0-9][0-9] après « x » ;
                fonction renommer le fichier ;
            finsi ;
            si le fichier contient « S[0-9] [0-9]-F[0-9][0-9] » alors
                numero = [0-9][0-9] après « F » ;
                fonction renommer le fichier ;
            finsi ;
        fin ;
fin ;
fin ;





fontion renommer le fichier :

si rep3 existe alors
    nouveau_nom = $rep1-$rep2-$rep3-Fichier$numero ;
    sinon
nouveau_nom = $rep1-$rep2-Fichier$numero ;
    finsinon ;   
renommer le fichier avec $nouveau_nom ;
finsi ;

Hors ligne

#10 Le 24/03/2011, à 15:20

fouduroi

Re : Renommage de masse [RESOLU]

il y a pyrenamer aussi


ubuntu 14.04 64 bits  / ubuntu 16.04 64 bits
asus p6t, core i7 920, 7go ram, nvidia gt630
http://www.pullco.fr/  association pour la Promotion de l’Utilisation des Logiciels Libres en COrrèze
pourquoi Linux est le meilleur?

Hors ligne

#11 Le 24/03/2011, à 16:40

yirkkiller

Re : Renommage de masse [RESOLU]

Je dois en être loin, mais que dire de ça :


for rep1 in `ls *` do
    cd $rep1 ;
    for rep2 in `ls *` do
        cd $rep2 ;
        if [`ls –d *` -ne NULL] then
            for rep3 in `ls *` do
                cd $rep3 ;
                fi ;
        for file in `ls *s*f*` do
             numero=`expr match "$file" 's[0-9] [0-9]*f\([0-9] [0-9]*\)'`;
                 function renommer($file,$numero,$rep1,$rep2,$rep3) ;
        done ;
        for file in `ls *x*` do
                numero=`expr match "$file" [0-9]*x\([0-9] [0-9]*\)'`    ;                            
                                function renommer($file,$numero,$rep1,$rep2,$rep3) ;
                done ;
                for file in `ls *S*-F*` do
                numero=`expr match "$file" 'S[0-9] [0-9]*-F\([0-9] [0-9]*\)'`;
                function renommer($file,$numero,$rep1,$rep2,$rep3) ;
                done ;
    done ;
done ; 


function renommer($file,$numero,$rep1,$rep2,$rep3) : 
if [$rep3 -ne NULL] then
    nouveau_nom = $rep1-$rep2-$rep3-Fichier$numero ;
    else nouveau_nom = $rep1-$rep2-Fichier$numero ;
fi ;
mv $file $nouveau_nom ;
return;

Même s'il y a sûrement des tonnes d'erreurs de syntaxe...

Dernière modification par yirkkiller (Le 24/03/2011, à 16:41)

Hors ligne

#12 Le 24/03/2011, à 19:50

Levi59

Re : Renommage de masse [RESOLU]

Tu peux remplacer tout le texte et les symboles des noms par un simple underscore (touche 8 "_")...

Tu aurais au final uniquement des noms sous la forme "_1_01" à la place de "sem1-fichier01" ou "S1-f01", tu n'aurais qu'à traiter les fichiers pour les renommer en utilisant l'underscore comme séparateur.

Bien sûr ce n'est qu'une idée...

Dernière modification par Levi59 (Le 24/03/2011, à 19:50)

Hors ligne

#13 Le 25/03/2011, à 01:39

sputnick

Re : Renommage de masse [RESOLU]

Se placer dans Presentations, tous les fichiers seront copiés dans /tmp/copy_reformate/ :

find -type f -exec bash -c '
    install -D "$1" $(sed -r "s@\./Presentation([^/]+)/([^/]+)/(.*)@/tmp/copy_reformate/\1-\2-\3.ppt@g" <<< "$1")
' -- {} \;

Dernière modification par sputnick (Le 25/03/2011, à 01:41)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#14 Le 25/03/2011, à 17:33

yirkkiller

Re : Renommage de masse [RESOLU]

Voilà à quoi je suis arrivé :

#!/bin/sh
#Script de renommage des series

transformation () {
        echo $1 $2;
        num1=0;
        num2=0;
        num3=0;
        nom=$1;

        num1=`expr match "$1" '.*s[0-9][0-9]e\([0-9][0-9]*\)'`;
        num2=`expr match "$1" '.*S[0-9][0-9]-E\([0-9][0-9]*\)'`;
        num3=`expr match "$1" '.*[0-9]x\([0-9][0-9]*\)'`;

        if [[$num1 -ne 0]] ; then
                nom=$num1.$2;
        fi;
        if [[$num2!=0]]; then
                nom=$num2.$2;
        fi;
        if [[$num3!=0]]; then
                nom=$num3.$2;
        fi;

        echo "mv $1 $nom";
}

for fichier in `find ./ -name *.txt` ; do
        ext=ppt;
        transformation $fichier $ext;
done;

Déjà si j'obtiens juste le numéro du fichier (02.ppt) ça sera possible de le renommer avec Metamorphose2.

Vous pourriez m'aider à le débugger ?

Merci !

Hors ligne

#15 Le 25/03/2011, à 19:53

Levi59

Re : Renommage de masse [RESOLU]

Voici ma version de ce que tu demande...
C'est limité à l'exemple donné au niveau du fonctionnement, c'est à dire:
- Jusqu'à 2 sous dossiers

Presentations
|___PresentationSecurite
       |___Seminaire01
              |___Fichier1
              |___Fichier2
       |___Seminaire02
              |___Fichier1
              |___Fichier2

- Les fichiers sont renommés sous la forme DIR1-DIR0-FichierNUMERO.EXT (pour un fichier dans ./DIR1/DIR0/)
-Le "NUMERO" est récupéré du nom de fichier original. l'extension est conservée en minuscule.

Au niveau de l'utilisation, 2 possibilités :
- le lancer dans le dossier "Presentations" (confere exemple précédent) sans option (ex : renommeur )
-le lancer depuis n'importe quel dossier en précisant le chemin du dossier "Presentations" ( ex : renommeur ~/docs/Presentations )

Confere plus bas

EDIT : Je l'ai testé rapidement alors test le tout de même sur un échantillon avant.

Dernière modification par Levi59 (Le 28/03/2011, à 15:40)

Hors ligne

#16 Le 25/03/2011, à 20:16

yirkkiller

Re : Renommage de masse [RESOLU]

Bonjour,

Non, j'ai besoin d'extraire le numéro, je ne peux pas l'attribuer au hasard... Sinon j'aurais déjà trouvé depuis bien longtemps...

Il faudrait si possible juste me dire pourquoi mon script ne marche pas... Je sens que je suis près du but !!!

Hors ligne

#17 Le 26/03/2011, à 07:25

Levi59

Re : Renommage de masse [RESOLU]

Mon script extrait le numéro du fichier original... Il fait exactement ce qui était demandé au début.

Hors ligne

#18 Le 28/03/2011, à 10:55

Levi59

Re : Renommage de masse [RESOLU]

Je ne sais pas si ce long silence signifie que tu as obtenu ce que tu souhaitais mais si tel est le cas, un merci serait apprécié et un [RÉSOLU] dans le Titre serait souhaitable.

Merci d'avance.

Hors ligne

#19 Le 28/03/2011, à 13:52

yirkkiller

Re : Renommage de masse [RESOLU]

Bonjour,

Désolé pour le long retard, mais j'étais absent ce week end.

J'ai testé le script, j'ai une erreur.

mv: «./.-.-Fichier000.sh» et «././.-.-Fichier000.sh» identifient le même fichier
dirname: opérande supplémentaire «Tzea]»
Saisissez « dirname --help » pour plus d'informations.
mv: la cible «././.-.-Fichier000.txt» n'est pas un répertoire
mv: «./.-.-Fichier000.swp» et «././.-.-Fichier000.swp» identifient le même fichier

J'ai fait une machine de test pour voir, voici l'arborescence de test :

Presentations/
├── PresentationSecu
│   ├── Seminaire01
│   │   └── [Seminaire Securité DG Rennes] - Secu 1x01 Français.txt
│   └── Seminaire02
├── PresentationInfo
│   ├── Seminaire01
│   ├── Seminaire02
│   └── Seminaire03
└── PresentationDG
    ├── Seminaire01
    └── Seminaire02

Voici la commande lancée :

 bash --debug script.sh Presentations/

Merci !

Dernière modification par yirkkiller (Le 28/03/2011, à 13:53)

Hors ligne

#20 Le 28/03/2011, à 15:25

yirkkiller

Re : Renommage de masse [RESOLU]

Bonjour,

J'y suis enfin arrivé grâce à votre aide et vos lignes de code !

Voici mon script :

#!/bin/sh
# Script de renommage des fichiers en masse
# Avec extraction du numéro du fichier

# Fonction transformation
transformation () {
        # Initialisation des variables
        num1=0;
        num2=0;
        num3=0;
        nom=$2;

        # Extraction du numéro du fichier
            # Si sous la forme s05f02
            num1=`expr match "$2" '.*s[0-9][0-9]f\([0-9][0-9]*\)'`;
            # Si sous la forme S05-F02
            num2=`expr match "$2" '.*S[0-9][0-9]-F\([0-9][0-9]*\)'`;
            # Si sous la forme 5x02
            num3=`expr match "$2" '.*[0-9]x\([0-9][0-9]*\)'`;

        # Test de la méthode d'extraction et affectation du nouveau nom : Chemin/Numero.Extension ($path/$num.$ext)
        if [ "${num1:=0}" -ne 0 ]
        then
        {
                nom=$1/$num1.$3;
        }
        fi;

        if [ "${num2:=0}" -ne 0 ]
        then
        {
                nom=$1/$num2.$3;
        }
        fi;

        if [ "${num3:=0}" -ne 0 ]
        then
        {
                nom=$1/$num3.$3;
        }
        fi;

        # Affichage de la commande à envoyer
        echo mv $2 $nom;
        # Renommage du fichier
        mv $2 $nom;
}

# Programme principal
    # Recherche des fichiers txt
    for fichier in `find /home/users/Presentations/ -name '*'txt*` ; do
            # Enlever les espaces dans le nom
            rename * "s/ /_/";
            # Récupérer le chemin du fichier
            path="${fichier%/*}";
            # Récupérer l'extension du fichier
            ext=txt;
            # Appel de la fonction transformation avec le chemin du fichier, le nom et l'extension.
            transformation $path $fichier $ext;
    done;
    
    # Recherche des fichiers jpg
    for fichier in `find /home/users/Presentations/ -name '*'jpg*` ; do
            # Enlever les espaces dans le nom
            rename * "s/ /_/";
            # Récupérer le chemin du fichier
            path="${fichier%/*}";
            # Récupérer l'extension du fichier
            ext=jpg;
            # Appel de la fonction transformation avec le chemin du fichier, le nom et l'extension.
            transformation $path $fichier $ext;
    done;

Je me suis servi de la façon dont Levi a géré les IF et les REGEX, et les REGEX de WW

Maintenant que tous les fichiers sont sous la forme 01.ppt, je vais pouvoir me servir de Metamorphose pour renommer les fichiers avec le nom du dossier devant d'un seul coup.

Merci à tous pour votre énorme coup de main !

Hors ligne

#21 Le 28/03/2011, à 15:38

Levi59

Re : Renommage de masse [RESOLU]

Ok je vais regarder tout ça...
Mais d'après ce que renvoi le debug, c'est un problème pour récupérer les différentes partie.

EDIT
Corrigé! J'avais pas pensé à certains cas (un fichier présent à la racine des dossiers à traiter, des chemins mal interprétés) et l'oublie de quelques guillemets (qui foutaient le bordel quand il y avait des espaces dans les noms de fichiers)

J'ai testé et normalement ça passe.

#!/bin/bash
# script pour renommer rapidement et simplement les fichiers d'une arborescence
# sous la forme DIR1-DIR0-FichierNUM.EXT
#
# Copyright (C) 25 Mars 2011, Rombeaut Rodolphe
# http://scriptam.over-blog.com/
# Released into the public domain.

[ -n "$1" ] && cd "$1"

echo "Vous aller renommer les fichiers du dossier $(pwd)"
echo "Êtes-vous d'accord <o ou n> ?"
read question
[ "$question" != "o" ] && {
    echo "Annulation"
    exit
}

shopt -s extglob
while read
do
    EXT="${REPLY##*.}"
    [ "${EXT:0:1}" == "/" ] && EXT=""
    FILE="${REPLY##*/}"
    FILE="${FILE%.*}"
    FILE="${FILE//+([^0-9])/_}"
    NUM="${FILE%_*}"
    NUM="0${NUM##*_}"
    NUM=${NUM/+(0)/}
    
    [ "${NUM:=0}" -lt 100 ] && {
        [ "${NUM:=0}" -lt 10 ] && NUM="00${NUM:=0}" || NUM="0${NUM}"
    }
    [ -d "$(dirname '${REPLY}')" ] && DIR0=$(dirname "${REPLY}")
    [ -d "${DIR0%/*}" ] && DIR1="${DIR0%/*}"
    
    DIR0="${DIR0##*/}"
    DIR1="${DIR1##*/}"
    
    [ "$DIR0" == "." ] && DIR0=""
    [ "$DIR1" == "." ] && DIR1=""
    [ -f "${DIR1}${DIR1:+/}${DIR0}${DIR0:+/}${DIR1}${DIR1:+-}${DIR0}${DIR0:+-}Fichier${NUM}${EXT:+.}${EXT,,}" ] && echo "fichier déjà renommé" || mv "$REPLY" "${DIR1}${DIR1:+/}${DIR0}${DIR0:+/}${DIR1}${DIR1:+-}${DIR0}${DIR0:+-}Fichier${NUM}${EXT:+.}${EXT,,}"


done < <(find . -maxdepth 3 -type f)
shopt -u extglob
exit

Dernière modification par Levi59 (Le 28/03/2011, à 15:51)

Hors ligne

#22 Le 28/03/2011, à 15:55

Levi59

Re : Renommage de masse [RESOLU]

Je viens de voir que tu as modifié ton propre script. Je n'ai pas vérifié son contenu mais que tu choisisses de garder le tiens ou d'utiliser le miens, si tu as résolu ton problème, indique le dans le titre en ajoutant [RÉSOLU].

Hors ligne