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 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 )
cool

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

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 wink


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 »

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)

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 smile

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 big_smile

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 wink

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... big_smile

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 smile

Hors ligne

#12 Le 21/03/2014, à 11:56

psyphi

Re : Renommer des fichiers en conservant le premier nombre et l'extension.

Sciensous a écrit :

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.

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 !

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