Page 1 sur 2

renommage de fichier

Publié : ven. 01 févr. 2008, 10:46
par djaac
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

Publié : ven. 01 févr. 2008, 11:08
par marc[i1]
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 ;)

Publié : ven. 01 févr. 2008, 11:50
par _alexmyself
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

Publié : ven. 01 févr. 2008, 13:49
par djaac
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

Publié : ven. 01 févr. 2008, 14:01
par Cactus
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 ! :)

Publié : ven. 01 févr. 2008, 14:04
par Cactus
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:

Publié : ven. 01 févr. 2008, 14:07
par gyo
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!

Publié : ven. 01 févr. 2008, 14:14
par _alexmyself
arff..reponse entre temps :)

Publié : ven. 01 févr. 2008, 14:26
par djaac
je test merci bcp à tous
vraiment cool

Publié : ven. 01 févr. 2008, 14:32
par djaac
gyo j'ai testé la boucle c'est impeccable, merci bcp

et merci pour les autres je test aussi

bye

Publié : ven. 01 févr. 2008, 14:43
par Cactus
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: )

Publié : ven. 01 févr. 2008, 19:06
par bapt
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.

Publié : sam. 02 févr. 2008, 13:12
par djaac
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

Publié : sam. 02 févr. 2008, 13:19
par vincentxavier
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.

Publié : sam. 02 févr. 2008, 13:28
par wain
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 ?

Publié : sam. 02 févr. 2008, 13:56
par mélodie
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

Publié : sam. 02 févr. 2008, 14:27
par vincentxavier
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 ;

Publié : sam. 02 févr. 2008, 15:04
par Cactus
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 !) ;)

Publié : sam. 02 févr. 2008, 15:17
par wain
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

Publié : sam. 02 févr. 2008, 15:53
par vincentxavier
Le problème là est de pouvoir "catcher" une partie de l'expression régulière pour la réutiliser !