#1 Le 19/03/2014, à 20:07
- Spike00
Renommer des fichiers en conservant le premier nombre et l'extension.
lire le dernier message concernant le sujet
Bonjour,
Novice en la matière, je cherche à renommer des fichiers ayant une récurrence en modifiant l'extension
Exemple (Mon cas) :
toto.torrent.txt > toto.torrent
blabla.torrent.txt > blabla.torrent
...
La récurrence ici "torrent.txt" que je souhaite renommer en "torrent".
Voici le code incomplet :
n=0; for i in *torrent.txt; do mv -i "$i" ??????? ;done
Merci d'avance.
Dernière modification par Spike00 (Le 26/03/2014, à 06:37)
Hors ligne
#2 Le 19/03/2014, à 21:16
- Sciensous
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
si l'extension est toujours la même:
ext=".txt"; for i in *torrent$ext; do mv -i "$i" `basename "$i" $ext`; done
attention, faire un copier coller car:
les '`' sont dpéciaux et s'obtiennent par alt F7 (c'est pour récupérer un retour de commandes)
il y a un espace entre "$i" et $ext (basename retourne le nom de fichier+ext, mais suivi d'un motif , supprime ce dernier )
Dernière modification par Sciensous (Le 19/03/2014, à 21:17)
antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )
Hors ligne
#3 Le 19/03/2014, à 21:22
- tiramiseb
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
Salut,
Une solution similaire, mais plus simple en terme de syntaxe :
for i in *torrent.txt; do mv "$i" "$(basename "$i" .txt)" ;done
(par ailleurs, la solution de Sciensous ne fonctionnera pas avec des espaces dans le nom d'un fichier
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#4 Le 19/03/2014, à 21:41
- Sciensous
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
@tiramiseb: ok pour les guillemets manquants
antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )
Hors ligne
#5 Le 19/03/2014, à 23:51
- Spike00
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
Merci beaucoup pour vos réponses rapides.
Par curiosité pourquoi écrit on le code ainsi :
for i in *torrent.txt; do mv "$i" "$(basename "$i" .txt)" ;done
et non
for i in *torrent.txt; do mv "$i" basename "$i" .txt ;done
j'imagine que c'est pour "prendre la commande" mais ne comprends pas exactement le fonctionnement, puisque après do mv "$i"
la commande mv attend un autre argument après le premier "$i"
$ sert à utiliser une variable qu'on a déclarée? (basename n'est pas une variable)
Et pourquoi la solution de Sciensous ne fonctionnera pas avec des espaces dans le nom d'un fichier?
Hors ligne
#6 Le 20/03/2014, à 04:25
- Spike00
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
Finalement c'est bon
Hors ligne
#7 Le 20/03/2014, à 09:17
- serged
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
Ou utiliser [p]rename :
rename 's/\.torrent\.txt/\.torrent/' *.torrent.txt
LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)
Hors ligne
#8 Le 20/03/2014, à 09:23
- tiramiseb
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
Par curiosité pourquoi écrit on le code ainsi :
for i in *torrent.txt; do mv "$i" "$(basename "$i" .txt)" ;done
et non
for i in *torrent.txt; do mv "$i" basename "$i" .txt ;done
« $( ... ) » dit qu'il faut exécuter ce qui est dans les parenthèses et tout remplacer par le résultat.
Sans ça, on donne chaque élément en argument de la commande avant.
Concrètement, si $i est égal à toto.torrent.txt, alors ...
... avec la première forme on aura :
1/ basename "$i" .txt sera transformé en basename "toto.torrent.txt" .txt
2/ le résultat de basename "toto.torrent.txt" .txt est toto.torrent
3/ ainsi, mv "$i" "$(basename "$i" .txt)" sera transformé en mv "toto.torrent.txt" "toto.torrent"
4/ ce qui veut dire « déplace "toto.torrent.txt" vers "toto.torrent" », ce qui correspond à un renommage
... avec la seconde forme on aura :
1/ mv "$i" basename "$i" .txt sera transformé en mv "toto.torrent.txt" basename "toto.torrent.txt" .txt
2/ ce qui veut dire « déplace "toto.torrent.txt" et basename et "toto.torrent.txt" vers .txt », ce qui correspond à un déplacement de trois fichiers (dont deux ayant le même nom) vers un répertoire appelé .txt
$ sert à utiliser une variable qu'on a déclarée? (basename n'est pas une variable)
Le $ sert en effet à utiliser le contenu d'une variable préalablement définie.
basename est une commande à exécuter. C'est le retour de cette commande qu'on exploite.
En l'occurrence, ça sert à supprimer l'extension du nom d'un fichier (premier argument le nom du fichier, second argument l'extension à supprimer)
Et pourquoi la solution de Sciensous ne fonctionnera pas avec des espaces dans le nom d'un fichier?
Parce que le résultat de la commande basename n'est pas entouré de guillemets.
Avec un nom de fichier comme « titi toto.torrent.txt », ça donnerait :
mv -i "titi toto.torrent.txt" titi toto.torrent
ce qui veut dire « déplace "titi toto.torrent.txt" et titi vers toto.torrent »
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#9 Le 20/03/2014, à 09:27
- tiramiseb
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
serged: oui en effet, on n'utilise pas assez la commande rename :-)
Je me permets alors de simplifier encore ta commande :
rename 's/\.txt$//' *.torrent.txt
(et à mon avis ce sera beaucoup plus performant que de faire une boucle for dans un shellscript)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#10 Le 21/03/2014, à 11:40
- Sciensous
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
peu peu peu !
Ne confondez pas plus simple avec plus compact
l'utilisation de rename de manière intuitive nécessite de maitriser les regex (ok pour s=substitute mais les code d'échappement, faut les connaite)
la sanction peut être lourde en cas confusion des instructions!
dans mon, c'est du shell de base, classiquement, donc mv + basename + boucle et c'est ok
c'est mon avis de néophyte
Autre point, pour Spike00, il me semble que cette rubrique concerne surtout les astuces, scripts utiles à proposer : réf
De plus, si tu as trouvé ton bonheur --> résolu dans le titre
Maintenant, nous sommes tous sympas, donc nous répondons quand même et proposons dans la discussion les différentes manières de résoudre un point.
Bonne journée
Dernière modification par Sciensous (Le 21/03/2014, à 11:43)
antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )
Hors ligne
#11 Le 21/03/2014, à 11:47
- tiramiseb
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
l'utilisation de rename de manière intuitive nécessite de maitriser les regex (ok pour s=substitute mais les code d'échappement, faut les connaite)
la sanction peut être lourde en cas confusion des instructions!
Oui c'est vrai, j'ai tendance à oublier la complexité des regex, la syntaxe sed et tout ça... C'est devenu si naturel pour moi...
Cela étant dit, oui la boucle c'est bien, c'est facile à comprendre, mais ça perd réellement en performances... à voir si c'est un one-shot pas urgent ou un truc qui s'exécute souvent et qui doit être rapide
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#12 Le 21/03/2014, à 11:56
- psyphi
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
Ne confondez pas plus simple avec plus compact smile
Je ne pense pas qu'il ait confusion. Je t'accorde que la simplicité est une notion relativement abstraite, qui dépend surtout de la connaissance de chacun des différents outils.
Mais dans le cas présent, rename à l'avantage d'être:
Standard, c'est un programme Perl mais qui est présent par défaut sur un grand nombre de distribution
Un seul outil est nécéssaire (sinon mv et basename)
Pas de boucle for
Plus concis, donc potentiellement moins de chance d'écrire une erreur
Peut être utiliser avec l'option -n pour simuler la sortie sans renommer les fichiers
-n, --no-act
No Action: show what files would have been renamed.
Mon blog: http://blog.bores.fr
Mon wiki: http://bores.fr/wiki
Mes programmes libres: https://github.com/tbores
Hors ligne
#13 Le 24/03/2014, à 23:03
- Spike00
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
Encore merci
Hors ligne
#14 Le 26/03/2014, à 06:02
- Spike00
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
Re,
j'en appelle encore à vos compétences :
j'aimerais renommer des fichiers en conservant le premier nombre et l'extension.
exemple :
blabla-toto tata 23 720. ac3.mp4
bla.bla.bla toto tata 145 1080.torrent
Mon approche (probablement pas la plus commode) :
nom="toto tata "
lesnombres= `sed 's/[A-Za-z.-]//g'`
lepremiernombre= ? conserver le premier nombre de la variable $lesnombres
extension= extraire la chaine de caractères après le dernier "."
.......; mv "$i" "$nom""$lepremiernombre""$extension"; done
l'ennui :
je ne sais comment faire pour la variable premiernombre, extension et comment lier les variables.
Hors ligne
#15 Le 26/03/2014, à 06:35
- pingouinux
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
Bonjour,
En bash
nom_fichier="blabla-toto tata 23 720. ac3.mp4"
premier_nombre=$(sed -r 's/([^0-9]*)(\b[0-9]+\b)(.*)/\2/' <<<"$nom_fichier")
echo premier_nombre="$premier_nombre"
extension=${nom_fichier##*.}
echo extension="$extension"
Résultat
premier_nombre=23
extension=mp4
Pour le nom, quels sont les critères pour l'isoler ?
Édité : Correction
Dernière modification par pingouinux (Le 26/03/2014, à 06:50)
Hors ligne
#16 Le 26/03/2014, à 07:56
- Spike00
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
Encore merci pingouinux,
Petit problème l'option -r ne fonctionne pas "sed: illegal option -- r"
Pour la variable premier_nombre je cherche le nombre "23"
Et pour le nom je ne l'isole pas je l'assigne moi même à la variable car l'ensemble des fichiers ont le même titre "nom" nom="toto "
ensuite je cherche à réunir les variables afin d'avoir le titre, le numéro et l'extension cela donne :
toto 23.mp4
Peux tu m'éclairer sur ton code :
extension=${nom_fichier##*.}
Hors ligne
#17 Le 26/03/2014, à 08:05
- pingouinux
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
Petit problème l'option -r ne fonctionne pas "sed: illegal option -- r"
Cela m'étonne. Peux-tu faire un copier-coller de la commande que tu lances et du message d'erreur ?
Peux tu m'éclairer sur ton code :
extension=${nom_fichier##*.}
Supprime dans nom_fichier tous les caractères à partir du début jusqu'au dernier point (inclus).
Voir man bash, rubrique Parameter Expansion.
ensuite je cherche à réunir les variables afin d'avoir le titre, le numéro et l'extension cela donne
nom_final="$nom$premier_nombre.$extension"
Hors ligne
#18 Le 26/03/2014, à 08:56
- Spike00
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
Cela m'étonne. Peux-tu faire un copier-coller de la commande que tu lances et du message d'erreur ?
Pour la bonne raison que je suis sur mac...
premier_nombre=$(sed -r 's/(.*)(\b[0-9]+\b)(.*)/\2/' <<<"$nom_fichier")
sed: illegal option -- r
usage: sed script [-Ealn] [-i extension] [file ...]
sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]
Une solution?
Merci pour ton aide.
Dernière modification par Spike00 (Le 26/03/2014, à 08:59)
Hors ligne
#19 Le 26/03/2014, à 09:08
- pingouinux
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
Essaye ceci, plus compliqué, mais qui marche aussi chez moi :
premier_nombre=$(sed 's/\([^0-9]*\)\(\b[0-9]\+\b\)\(.*\)/\2/' <<<"$nom_fichier")
Hors ligne
#20 Le 26/03/2014, à 10:06
- Spike00
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
Essaye ceci, plus compliqué, mais qui marche aussi chez moi :
premier_nombre=$(sed 's/\([^0-9]*\)\(\b[0-9]\+\b\)\(.*\)/\2/' <<<"$nom_fichier")
Ne fonctionne pas sur le terminal mac
premier_nombre=$(sed 's/\([^0-9]*\)\(\b[0-9]\+\b\)\(.*\)/\2/' <<<"$nom_fichier")
echo $premier_nombre
Résultat :
blabla-toto tata 23 720. ac3.mp4
Je crois que les références arrières ne marchent pas sur mac.
(man sed (2005))
Sinon si tu peux prendre le premier nombre de la variable "nombre"
nombres=$(sed 's/[A-Za-z.-]//g' <<<"$nom_fichier")
echo $nom_fichier
Résultat :
23 720 34
Peut être avec la commande awk?
Dernière modification par Spike00 (Le 26/03/2014, à 13:23)
Hors ligne
#21 Le 26/03/2014, à 10:09
- pingouinux
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
Encore un essai
premier_nombre=$(sed 's/\([^0-9]*\)\([0-9]\+\)\(.*\)/\2/' <<<"$nom_fichier")
Hors ligne
#22 Le 26/03/2014, à 10:29
- Spike00
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
Encore un essai
premier_nombre=$(sed 's/\([^0-9]*\)\([0-9]\+\)\(.*\)/\2/' <<<"$nom_fichier")
non plus.
Hors ligne
#23 Le 26/03/2014, à 10:40
- tiramiseb
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
non plus.
Si tu donnais de manière précise les erreurs retournées (copier-coller systématique du terminal), on pourrait comprendre et donner des commandes qui pourraient fonctionner.
On n'est pas là pour jouer à un jeu de piste !
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#24 Le 26/03/2014, à 10:51
- Spike00
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
Encore un essai
premier_nombre=$(sed 's/\([^0-9]*\)\([0-9]\+\)\(.*\)/\2/' <<<"$nom_fichier")
non plus.
Désolé
nom_fichier="blabla-toto tata 23 720. ac3.mp4"
premier_nombre=$(sed 's/\([^0-9]*\)\([0-9]\+\)\(.*\)/\2/' <<<"$nom_fichier")
echo $premier_nombre
Résultat :
blabla-toto tata 23 720. ac3.mp4
Dernière modification par Spike00 (Le 26/03/2014, à 10:57)
Hors ligne
#25 Le 26/03/2014, à 11:18
- credenhill
Re : Renommer des fichiers en conservant le premier nombre et l'extension.
hello
$ ls -1
bla.bla.bla toto tata 145 1080.torrent
blabla-toto tata 23 720. ac3.mp4
$ rename -n 's/^([^0-9]*)( [0-9]*)(.*)(\.[a-z0-9]*$)/$2$4/' *
bla.bla.bla toto tata 145 1080.torrent renamed as 145.torrent
blabla-toto tata 23 720. ac3.mp4 renamed as 23.mp4
Hors ligne