renommage de fichier

Autres projets et contributions
djaac
Daikyu
Messages : 68
Inscription : mar. 23 janv. 2007, 19:22

renommage de fichier

Message par djaac » ven. 01 févr. 2008, 10:46

je cherche un moyen rapide de renommer un ensemble de fichier :
ex :
renommé ces fichier:
sa25 sa27 sa29 sa31 sar25 sar27 sar29 sar31
sa24 sa26 sa28 sa30 sar24 sar26 sar28 sar30
en fichier :
sa.2008_01_31 pour sa31
sa.2008_01_25 pour sa25 etc*

merci pour votre aide

Avatar de l’utilisateur
marc[i1]
Maître du Kyudo
Messages : 1753
Inscription : ven. 27 oct. 2006, 10:48
Localisation : Nantes (44)
Contact :

Message par marc[i1] » ven. 01 févr. 2008, 11:08

Salut,

tu as fait un essai avec for et cut ?

Code : Tout sélectionner

for i in * ; do
   prefix=$(ls $i | cut -d 'r' -f1)
   nombre=$(ls $i | cut -d 'r' -f2)
   cp $1 ${prefix}.2008_01_${nombre}
done
Enfin, c'est une piste ! :)

Tu peux aussi jouer avec if pour le cas de sa ou sar ;)
Ne vous emmerdez plus, emmerdez les autres.

_alexmyself
Chu Ko Nu
Messages : 405
Inscription : lun. 18 sept. 2006, 16:21
Localisation : france, yvelines 78

Message par _alexmyself » ven. 01 févr. 2008, 11:50

je te déconseille vivement de decommenter la ligne 'mv...' avant que tout ne soit pas nickel..

Code : Tout sélectionner

#!/bin/bash

script_dir=`pwd`
script_name=$0
script_name=${script_name##*/}
echo $script_name

for nom_fichier in `ls`
	do
	if [ "$nom_fichier" == "." ]
		then
		echo -n ''
	elif [ "$nom_fichier" == ".." ]
		then
		echo -n ''
	elif [ "$nom_fichier" == "$script_name" ]
		then
		echo -n ''
	else
		nom=${nom_fichier%[0-9]*}
		numero=${nom_fichier#$nom}
		nouvo_nom=$nom".2008_01_"$numero

		#ligne ci-dessous pour faire une eventuelle mise au point, sert a rien
		echo "$nouvo_nom"
		#ligne ci-dessous a decommenter quand mise au point faite
		#mv $nom_fichier $nouvo_nom
		fi
	done
Dernière modification par _alexmyself le ven. 01 févr. 2008, 14:02, modifié 1 fois.

djaac
Daikyu
Messages : 68
Inscription : mar. 23 janv. 2007, 19:22

Message par djaac » ven. 01 févr. 2008, 13:49

super merci bcp,
donc si je dois modifier ts mes fichiers sa25 sa26 etc en sa.2008_01[25-26 etc]
commen faire dans le script *?

desole mais j'ai du mal avec les script

merci encore

Cactus
Maître du Kyudo
Messages : 2073
Inscription : sam. 16 sept. 2006, 10:39
Localisation : 31 - Toulouse Nord

Message par Cactus » ven. 01 févr. 2008, 14:01

tu as aussi la commande rename, qui ne modifie pas les attributs de date des fichiers !
En une seule commande :

Code : Tout sélectionner

$ rename  sa  sa.2008_01_  sa*
man rename pour mieux comprendre ! ;)

EDIT : bon, j'explique la commande : on remplace sa par sa.2008_01_ pour tous les fichiers sa* du répertoire ! :)

Cactus
Maître du Kyudo
Messages : 2073
Inscription : sam. 16 sept. 2006, 10:39
Localisation : 31 - Toulouse Nord

Message par Cactus » ven. 01 févr. 2008, 14:04

Sinon, il existe aussi krename (appli kde) qui propose la même chose, en plus étoffé et en interface graphique.
Mais je l'ai trouvé trop lourd par rapport à une simple ligne de commande ! :wink:

Avatar de l’utilisateur
gyo
Maître du Kyudo
Messages : 1049
Inscription : jeu. 19 avr. 2007, 10:40
Localisation : Nantes (44)
Contact :

Message par gyo » ven. 01 févr. 2008, 14:07

un ptit ouhanelaïneur en sh :

Code : Tout sélectionner

for f in sa*; do basename=${f%%[0-9]*}; number=${f#$basename}; echo "mv $f $basename.2008_01_$number"; done
[EDIT]
djaac a écrit : super merci bcp,
donc si je dois modifier ts mes fichiers sa25 sa26 etc en sa.2008_01[25-26 etc]
commen faire dans le script *?

desole mais j'ai du mal avec les script

merci encore
si tu utilises mon script ci-dessus, tu le copies/colles sur la ligne de commande et tu l'exécute dans le répertoire comprenant tes fichiers. Ce scrip ne fais qu'afficher la commande à exécuter pour renommer, si ça correspond à tes attentes, tu retire le echo et les guillemets autour du mv -> ça donne ça :

Code : Tout sélectionner

for f in sa*; do basename=${f%%[0-9]*}; number=${f#$basename}; mv $f $basename.2008_01_$number; done
et hop, tes fichiers seront renommés!
Dernière modification par gyo le ven. 01 févr. 2008, 14:23, modifié 1 fois.

_alexmyself
Chu Ko Nu
Messages : 405
Inscription : lun. 18 sept. 2006, 16:21
Localisation : france, yvelines 78

Message par _alexmyself » ven. 01 févr. 2008, 14:14

arff..reponse entre temps :)

djaac
Daikyu
Messages : 68
Inscription : mar. 23 janv. 2007, 19:22

Message par djaac » ven. 01 févr. 2008, 14:26

je test merci bcp à tous
vraiment cool

djaac
Daikyu
Messages : 68
Inscription : mar. 23 janv. 2007, 19:22

Message par djaac » ven. 01 févr. 2008, 14:32

gyo j'ai testé la boucle c'est impeccable, merci bcp

et merci pour les autres je test aussi

bye

Cactus
Maître du Kyudo
Messages : 2073
Inscription : sam. 16 sept. 2006, 10:39
Localisation : 31 - Toulouse Nord

Message par Cactus » ven. 01 févr. 2008, 14:43

J'avoue ne pas comprendre pourquoi ne pas utiliser la commande ultra-simple de rename, et préférer écrire un script...
m'enfin, ça aide aussi à la compréhension de ce charabia qu'est le bash (pour moi ! :zarb: )

Avatar de l’utilisateur
bapt
Daikyu
Messages : 85
Inscription : jeu. 20 sept. 2007, 09:20
Contact :

Message par bapt » ven. 01 févr. 2008, 19:06

Comment faites vous pour vivre sans zsh ?

Code : Tout sélectionner

zmv 'sa(*)' 'sa.2008_01_$1'
Accéssoirement, thunar a un outil de rename de masse qui fait la même chose pour ceux qui veulent du graphique.

djaac
Daikyu
Messages : 68
Inscription : mar. 23 janv. 2007, 19:22

Message par djaac » sam. 02 févr. 2008, 13:12

bapt,
si je comprend bien ,
pour mon exemple, si je dois enommer ts le fichiers sa1 sa2 sa36, je tape :
zmv 'sa(*)' 'sa.2008_01_$1'

mais $1 correspond à quoi, peux tu me faire avec exemple concret stp.

merci

Avatar de l’utilisateur
vincentxavier
Elfe
Messages : 778
Inscription : ven. 11 août 2006, 18:17
Localisation : Epinay sur Seine (93)
Contact :

Message par vincentxavier » sam. 02 févr. 2008, 13:19

bapt a écrit :Comment faites vous pour vivre sans zsh ?

Code : Tout sélectionner

zmv 'sa(*)' 'sa.2008_01_$1'
Accéssoirement, thunar a un outil de rename de masse qui fait la même chose pour ceux qui veulent du graphique.
Hum, perso avant de regarder zsh, j'essaie déjà de voir en quoi bash est limité pour mes besoins, et pour l'instant, je n'ai pas encore trouvé mes limites.

D'autre part, à part te la jouer, je vois pas l'interêt de donner un exemple avec zsh là où l'utilisateur utilise clairement le shell par défaut de Arch, c'est à dire Bash. À la limite tu aurais donné un exemple avec un shell comme ksh ou sh qui se limite à la norme POSIX que cela aurait été plus compréhensible.
Warranty

THIS ADVICE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.

En clair, je ne pourrais être tenu responsable des dégats causés par l'utilisation de mes conseils

Image

Avatar de l’utilisateur
wain
Maître du Kyudo
Messages : 1854
Inscription : ven. 11 août 2006, 19:15
Localisation : Nancy (54)
Contact :

Message par wain » sam. 02 févr. 2008, 13:28

Moi je trouve intéressante la remarque de bapt. Ca montre à tous combient un truc à priori compliqué en bash peut s'avérer simple lorsqu'on a le bon outil. A force d'autres passerons peut-être à zsh.

Presque tout le monde est parti bille en tête sur une solution en bash alors qu'elle serait peut-être plus simple et tout aussi accessible en perl, python ou zsh. Si nous linuxiens acharnés ne promouvons pas la diversité, qui le fera ?

Avatar de l’utilisateur
mélodie
Maître du Kyudo
Messages : 2785
Inscription : lun. 30 oct. 2006, 02:06
Localisation : Pyrénées
Contact :

Message par mélodie » sam. 02 févr. 2008, 13:56

wain a écrit :(...)perl, python ou zsh. Si nous linuxiens acharnés ne promouvons pas la diversité, qui le fera ?
+1

Je ne connais toujours rien au shell, mais ne peux m'empêcher de voir que la commande zsh est ultra-courte (et compréhensible à mes yeux de néophyte) par rapport aux autres solutions proposées.

Vive la diversité ! :D

Avatar de l’utilisateur
vincentxavier
Elfe
Messages : 778
Inscription : ven. 11 août 2006, 18:17
Localisation : Epinay sur Seine (93)
Contact :

Message par vincentxavier » sam. 02 févr. 2008, 14:27

djaac a écrit :bapt,
si je comprend bien ,
pour mon exemple, si je dois enommer ts le fichiers sa1 sa2 sa36, je tape :
zmv 'sa(*)' 'sa.2008_01_$1'

mais $1 correspond à quoi, peux tu me faire avec exemple concret stp.

merci
L'exemple nécessite d'utiliser zsh et la fonction zmv, qui ne sont ni POSIX, ni même dans les extensions GNU. Il s'agit là d'extensions propres à zsh.

Pour le commenter, disons que le (*) permet de stocker la partie située après 'sa' dans la variable $1. Par exemple,

Code : Tout sélectionner

zmv '(sa)(*)' '200801$1\ $2'
permettrait de renommer les fichiers sa* en 200801* sa.

Il existe quantité de méthode pour faire ce que tu veux. Personnellement, je ferais

Code : Tout sélectionner

for i in sa* ; do mv $i `echo $i | sed -e 's/([0-9]*)/.2008_01_\1/' ` ; done ;
Warranty

THIS ADVICE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.

En clair, je ne pourrais être tenu responsable des dégats causés par l'utilisation de mes conseils

Image

Cactus
Maître du Kyudo
Messages : 2073
Inscription : sam. 16 sept. 2006, 10:39
Localisation : 31 - Toulouse Nord

Message par Cactus » sam. 02 févr. 2008, 15:04

moi, je veux bien découvrir tout plein de solutions... mais à quoi bon se compliquer la tâche lorsqu'une commande simple existe déjà ?
Pourquoi ne pas réécrire dans ce cas toutes les commandes en script zsh ? :shock:
ok, je caricature, mais bon, j'avoue être surpris de la réaction de djaac... (et pas des autres pour les propositions zsh & co !) ;)

Avatar de l’utilisateur
wain
Maître du Kyudo
Messages : 1854
Inscription : ven. 11 août 2006, 19:15
Localisation : Nancy (54)
Contact :

Message par wain » sam. 02 févr. 2008, 15:17

vincentxavier a écrit :Il existe quantité de méthode pour faire ce que tu veux. Personnellement, je ferais

Code : Tout sélectionner

for i in sa* ; do mv $i `echo $i | sed -e 's/([0-9]*)/.2008_01_\1/' ` ; done ;
Si on se limite au shell par défaut présent dans Archlinux (bash), autant utiliser ses fonctions de substitution au lieu de faire appel à un xième outil externe (sed):

Code : Tout sélectionner

for i in sa*; do mv $i ${i/sa/sa.2008_01_}; done

Avatar de l’utilisateur
vincentxavier
Elfe
Messages : 778
Inscription : ven. 11 août 2006, 18:17
Localisation : Epinay sur Seine (93)
Contact :

Message par vincentxavier » sam. 02 févr. 2008, 15:53

Le problème là est de pouvoir "catcher" une partie de l'expression régulière pour la réutiliser !
Warranty

THIS ADVICE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.

En clair, je ne pourrais être tenu responsable des dégats causés par l'utilisation de mes conseils

Image

Répondre