Pages : 1
#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 ).
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 :
$i=~ expr match "$file"
\d [0-9]
+ * (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
Pages : 1