#1 Le 17/03/2017, à 17:19
- marionz0210
Selection d'une partie d'un titre d'un fichier
Bonjour
Je début en shell. Je n'ai pas trouvé de réponse à ma question pour le moment .. J'ai un dossier constitué d'images dont les noms sont sous la forme : image_14.bmp
J'aimerais isoler le numéro (14) pour renommer l'image avec ce numéro mais avec 6 chiffres (000014.bmp).
Dejà, pour isoler le numéro, j'ai fait le code suivant :
cd ~/coucou
for i in *.bmp
do
numero=$(echo $i | sed 's/.*_\([0-9]\)/\1/')
echo $numero
done
Mais ça m'affiche par exemple "14.bmp" et j'aimerais bien qu'il n'y ait pas le ".bmp". Est ce que vous auriez une solution ?
J'ai trouvé cette commande sur internet ( numero=$(echo $i | sed 's/.*_\([0-9]\)/\1/') ) mais sincèrement je ne la comprend pas, est ce que quelqu'un peut me l'expliquer svp ?
Merci d'avance !
Marion
Hors ligne
#2 Le 17/03/2017, à 17:49
- pingouinux
Re : Selection d'une partie d'un titre d'un fichier
Bonjour,
Voici déjà une indication :
i=image_14.bmp
numero=$(sed -r 's/.*_([0-9]+).bmp/\1/' <<<"$i")
echo $numero
nouveau_nom=$(printf "%06d" "$numero").bmp
echo $nouveau_nom
qui donne ce résultat :
14
000014.bmp
Édité : Tu peux simplifier ainsi la première commande
numero=$(egrep -o '[0-9]+' <<<"$i")
Dernière modification par pingouinux (Le 17/03/2017, à 17:56)
Hors ligne
#3 Le 17/03/2017, à 18:11
- Hizoka
Re : Selection d'une partie d'un titre d'un fichier
Salut
comme le signale pingouinux, tes echo sont inutiles :
echo $i | sed ...
=>
sed ... <<< "${i}"
Pour récupérer très simplement le numéro et sans s’embêter avec sed :
x="image_14.bmp"
x="${x##*_}"
x="${x%.*}"
echo "${x}"
et pour les 0, pingouinux t'as donné la réponse.
Je début en shell.
Voila de quoi lire en français et apprendre énormément de choses : http://abs.traduc.org/abs-fr
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#4 Le 17/03/2017, à 20:25
- MicP
Re : Selection d'une partie d'un titre d'un fichier
Bonsoir
… est ce que quelqu'un peut me l'expliquer svp ?
numero=$(echo $i | sed 's/.*_\([0-9]\)/\1/')
- Le résultat de la commande ci-dessous (qui est entre les parenthèses ci-dessus) sera affecté à la variable numéro
echo $i | sed 's/.*_\([0-9]\)/\1/'
=======
echo $i
- la variable i sera transmise en entrée de la commande sed
sed 's/.*_\([0-9]\)/\1/'
- la commande sed s (search) fera une recherche du motif à remplacer
's/motifÀtraiter/remplacement/'
- motifÀtraiter : .*_\([0-9]\)
. => Tout caractère
.* => tout caractère répété 0 ou plusieurs fois
.*_ => tout caractère répété 0 ou plusieurs fois jusqu'au premier dernier caractère _ rencontré
[0-9] => un caractère chiffre de 0 à 9
- remplacement :
\1 => rappel de la première partie du motif de recherche qui est entre parenthèses => [0-9] <=> le premier chiffre rencontré
=======
Tout ce qui suit le premier caractère chiffre sera retransmis sans modification
si l'entrée est : image_14.bmp la partie non modifiée sera donc : 4.bmp
Dernière modification par MicP (Le 17/03/2017, à 21:55)
Hors ligne
#5 Le 17/03/2017, à 20:48
- Hizoka
Re : Selection d'une partie d'un titre d'un fichier
.*_ => tout caractère répété 0 ou plusieurs fois jusqu'au premier caractère _ rencontré
nope, c'est le dernier pas le 1er
sed 's/.*_\([0-9]\)/\1/' <<< "caca_01_02_03"
03
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#6 Le 17/03/2017, à 21:55
- MicP
Re : Selection d'une partie d'un titre d'un fichier
…nope, c'est le dernier pas le 1er …
Merci beaucoup
Je corrige mon précédent message en fonction.
Hors ligne
#7 Le 18/03/2017, à 14:32
- credenhill
Re : Selection d'une partie d'un titre d'un fichier
hello
$ rename -vn 's/^.*_([0-9]*)/sprintf "%06d", $1/e' im*.bmp
image_1.bmp renamed as 000001.bmp
image_10.bmp renamed as 000010.bmp
image_100.bmp renamed as 000100.bmp
image_5.bmp renamed as 000005.bmp
image_50.bmp renamed as 000050.bmp
Hors ligne
#8 Le 20/03/2017, à 09:04
- marionz0210
Re : Selection d'une partie d'un titre d'un fichier
Merci beaucoup à tous ! Toutes vos réponses m'ont été très utiles !
J'ai finalement écrit :
cd ~/coucou
for i in *.bmp
do
numero=$(sed -r 's/.*_([0-9]+).bmp/\1/' <<<"$i")
nouveau_nom=$(printf "%06d" "$numero").bmp
mv ~/coucou/$i ~coucou/$nouveau_nom
done
Modération : merci à l'avenir d'utiliser les balises code (explications ici).
Dernière modification par cqfd93 (Le 20/03/2017, à 09:43)
Hors ligne
#9 Le 20/03/2017, à 17:56
- Hizoka
Re : Selection d'une partie d'un titre d'un fichier
un conseil, utilise toujours les " autour de tes adresses, ça évite des soucis.
et pour les variables, encadre les de {} c'est plus lisible et c'est la nouvelle norme, cela permet bien plus de manipulations.
et quand tu as résolu ton problème, ajoute [Résolu] dans le titre de ton topic.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne