Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Appel à contributeurs pour la doc.

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.

#1 Le 17/03/2017, à 18:19

marionz0210

Selection d'une partie d'un titre d'un fichier

Bonjour smile

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, à 18: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, à 18:56)

Hors ligne

#3 Le 17/03/2017, à 19: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

Hors ligne

#4 Le 17/03/2017, à 21:25

MicP

Re : Selection d'une partie d'un titre d'un fichier

Bonsoir

marionz0210 a écrit :

… 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, à 22:55)

Hors ligne

#5 Le 17/03/2017, à 21: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

Hors ligne

#6 Le 17/03/2017, à 22:55

MicP

Re : Selection d'une partie d'un titre d'un fichier

…nope, c'est le dernier pas le 1er …

Merci beaucoup smile

Je corrige mon précédent message en fonction.

Hors ligne

#7 Le 18/03/2017, à 15: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, à 10: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 ! smile
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, à 10:43)

Hors ligne

#9 Le 20/03/2017, à 18: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.

Hors ligne