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 :
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 !
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 !
)
Publié : ven. 01 févr. 2008, 19:06
par bapt
Comment faites vous pour vivre sans zsh ?
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 ?
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é !
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,
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 ?
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):
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 !