Re: renommer en lot

2008-02-02 Par sujet mpg
Le (on) mardi 29 janvier 2008 20:00, Jack.R a écrit (wrote) :

 Il y a au moins un problème avec ce script ; la liste des fichiers
 à traiter doit tenir sur la ligne de commande.
 
 Je viens de faires des essais avec une trentaine de fichier dont les
 noms font environ 70 caractères, ls passe bien à la ligne mais cela
 fonctionne.

Je crois que ce n'est pas ce ça qu'il s'agissait. Le problème est que la
ligne de commande que peut traiter un shell a une longueur limitée. Donc si
il y trop de fichiers, le « for i in `ls -r` » va être transformé en 
« for i in 1.png 2.png [...] n.png » qui va faire exploser le shell si n est
trop grand.

Euh, ceci dit, en testant là chez moi (sous zsh), un petit
% for i in `seq 1 100`; do echo $i ; done; echo '';
n'a pas l'air de faire exploser quoi que ce soit, alors qu'il produit quand
même une *très* longue ligne de commande d'après le raisonnement précédent.

 Cela cloche lorsqu'il y a des espaces dans le nom des fichiers à
 traiter.
 
C'est logique. Pour éviter ça, on pourrait, avec zsh, faire :
for i in **/*.png
mais on perd alors le classement par date.

Par ailleurs, il y a un autre problème avec le `ls -t -r *.png`, lié au
traitement des *, qui est effectué par le shell, et non par ls : ainsi,
le -r ne sert ici à rien, car ls ne verra que la liste des .png du
répertoire courant, produite par le shell : il ne fera en fait que le
classement par date.
 

Manuel.


-- 
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench   
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs From et
Reply-To:

To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]



Re: renommer en lot

2008-01-29 Par sujet Jacques L'helgoualc'h
Vincent Gay a écrit, mardi 29 janvier 2008, à 07:34 :
 Remys Morrissette a écrit :
 j'ai une série de fichiers (+/- 25000)

 ../..

 que j'aimerais renommer de façon séquentiel
 dans le genre 1, 2, 3, , 25000
 ou encore, 01, 02, 03, ..., a1, a2, a3, , e...
 avec l'ordre par date si possible.

 des idées ?

 Remys

 sudo apt-get install krename

Ça me semble un peu lourd quand on n'utilise pas KDE :

,
| Version: 3.0.9-2.1
| Depends: kdelibs4c2a (= 4:3.5.4-1), libacl1 (= 2.2.11-1), libart-2.0-2
| (=  2.3.16),  libattr1 (=  2.4.4-1),  libaudio2,  libc6 (=  2.3.6-6),
| libfam0, libfontconfig1  (= 2.3.0), libfreetype6 (=  2.2), libgcc1 (=
| 1:4.1.0),  libice6,  libidn11  (=  0.5.18), libjpeg62,  libpng12-0  (=
| 1.2.8rel),  libqt3-mt  (=  3:3.3.6),  libsm6,  libstdc++6  (=  4.1.0),
| libx11-6, libxcursor1 ( 1.1.2),  libxext6, libxft2 ( 2.1.1), libxi6,
| libxinerama1, libxrandr2, libxrender1, libxt6, zlib1g (= 1:1.2.1)
| Size: 315276
`

~ # apt-get -s install krename
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances... Fait
Les paquets supplémentaires suivants seront installés : 
  hicolor-icon-theme kdelibs-data kdelibs4c2a libarts1c2a libavahi-qt3-1
  liblua50 liblualib50 libopenexr2c2a libqt3-mt menu-xdg
Paquets suggérés :
  fam libqt3-mt-psql libqt3-mt-mysql libqt3-mt-odbc
Paquets recommandés :
  libarts1-akode
Les NOUVEAUX paquets suivants seront installés :
  hicolor-icon-theme kdelibs-data kdelibs4c2a krename libarts1c2a
  libavahi-qt3-1 liblua50 liblualib50 libopenexr2c2a libqt3-mt menu-xdg
0 mis à jour, 11 nouvellement installés, 0 à enlever et 3 non mis à jour.


Avec  Perl, on  dispose de  /usr/bin/prename (=  rename), qui  permet de
renommer à l'aide de commandes :

 Usage: rename [-v] [-n] [-f] perlexpr [filenames]

Pour  compter, il faudrait  pouvoir initialiser  une variable  ad-hoc en
dehors de  la boucle où s'exécute  « perlexpr » ; j'ai  donc modifié une
copie de prename, en vérifiant que la variable $n était libre

~ $ diff prename /usr/bin/
39,40d38
 my $n = 42;
 

~ $ grep '\$n\' prename
my $n = 42;

et peux donc renommer séquentiellement les toto_*

~ $ ./prename -n 's/_/_ . $n++ . _/e' toto_*
toto_a renamed as toto_42_a
toto_b renamed as toto_43_b
toto_c renamed as toto_44_c
toto_d renamed as toto_45_d
toto_e renamed as toto_46_e
toto_f renamed as toto_47_f

Le script reste léger :
~ $ l prename
-rwxr-xr-x 1 lhh lhh 3000 2008-01-29 10:42 prename

Pour des besoins plus avancés, on pourrait ajouter une option comme

 [ -i perlbegin ]

pour ne pas avoir à modifier le code en fonction de la valeur initiale.
-- 
Jacques L'helgoualc'h


-- 
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench   
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs From et
Reply-To:

To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]



Re: renommer en lot

2008-01-29 Par sujet Andre Majorel
On 2008-01-28 06:59 +0100, Jack.R wrote:
 On Mon, 28 Jan 2008 00:11:58 -0500
 Remys Morrissette [EMAIL PROTECTED] wrote:

  j'ai une série de fichiers (+/- 25000)
  
  exemple :
  
  0bf153bfa73346bafd4035908ff3a4fb.png   Wed Oct 24 00:16:57 2007
  0bf30ca8b401ab42ad9adc8327ce8ac7.png Mon Sep 10 21:15:09 2007
  acda647ce3d021a81e126f9ccc622139.png Tue May 22 21:17:32 2007
  ace127012b35f74f29bf58a82268a98b.png Thu Apr 13 23:52:55 2006
  e3e1602a552ffe15b446388239b9299d.png Sun Apr 15 22:36:11 2007
  e3e3e4449d314d7abae0d1bba0acdc91.png Mon Sep 10 21:33:37 2007
  
  
  que j'aimerais renommer de façon séquentiel
  
  dans le genre 1, 2, 3, , 25000
  
  ou encore, 01, 02, 03, ..., a1, a2, a3, , e...
  
  avec l'ordre par date si possible.
 
 Un petit script bash (non testé, donc travailler sur une copie des
 images)
 
 #!/bin/sh
 count=0
 for item in `ls -t -r *.png`
 do
   mv $item `printf %06d $count`.png
   count=$(( $count + 1 ))
 done

Il y a au moins un problème avec ce script ; la liste des fichiers
à traiter doit tenir sur la ligne de commande. On aura plus de
chances d'aboutir en faisant :

  find . -name *.png -type f -printf '%T@ %p\n' |
sort -n |
awk '{ print mv \ $2 \  sprintf(%05d.png, NR) }' |
sh

Le code ci-dessus suppose que a) aucun des noms de fichiers à
renommer ne contient de newlines ou autres métacaractères shell,
b) qu'aucun des nouveaux noms n'existent et c) il est acceptable
de lancer un process mv par fichier. Voici une autre méthode qui
n'a pas ces inconvénients :

  find . -name *.png -type f -print0 |
grep -z '/[0-9a-f]\{32\}\.png$' |
perl -we '$/ = \0;
  while (defined ($pathname = )) {
$pathname =~ s/\0$//;
print  $pathname\n;
@s = stat $pathname;
die $pathname: $!\n unless @s;
push @files, [$s[9], $pathname];
  }
  @files = sort { $a-[0] = $b-[0] } @files;
  my $n = 0;
  foreach $f (@files) {
$oldname = $f-[1]; 
do {
  $n++;
  $newname = sprintf %05d.png, $n;
} while (-e $newname);
print $oldname - $newname\n;
rename $oldname, $newname
  or die $oldname: cannot rename to $newname ($!)\n;
  }'

Ce programme n'est pas prévu pour être utilisé de façon
incrémentale ; s'il est lancé plusieurs fois dans le même
répertoire après ajout de nouveaux fichiers [0-9a-f]{32}.png,
les numéros attribués aux nouveaux fichiers ne correspondront pas
à l'ordre des mtime, sauf si le plus ancien fichier ajouté est
plus récent que le plus récent fichier renommé dans la passe
précédente. Donc, si on renomme les fichiers de décembre puis on
ajoute les fichiers de novembre, pas la peine d'espérer que le
script remettra tous les numéros dans l'ordre.

-- 
André Majorel http://www.teaser.fr/~amajorel/
Thanks to the Debian project for going to such lengths never to
disclose the email addresses of their users. Think of all the
spam we would get if they didn't !


-- 
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench   
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs From et
Reply-To:

To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]



Re: renommer en lot

2008-01-29 Par sujet Andre Majorel
On 2008-01-29 19:37 +0100, Jack.R wrote:
 On Tue, 29 Jan 2008 15:05:43 +0100
 Andre Majorel [EMAIL PROTECTED] wrote:
 
   Un petit script bash (non testé, donc travailler sur une copie des
   images)
   
   #!/bin/sh
   count=0
   for item in `ls -t -r *.png`
   do
 mv $item `printf %06d $count`.png
 count=$(( $count + 1 ))
   done
  
  Il y a au moins un problème avec ce script ; la liste des fichiers
  à traiter doit tenir sur la ligne de commande.
 
 Je viens de faires des essais avec une trentaine de fichier dont les
 noms font environ 70 caractères, ls passe bien à la ligne mais cela
 fonctionne. 

Il faut essayer avec les 25000 qu'a le monsieur. :-)

 Cela cloche lorsqu'il y a des espaces dans le nom des fichiers à
 traiter.

Oui, parce que le shell fait une passe de word splitting sur le
résultat de l'expansion des backquotes.

 Je suis curieux et je n'ai pas compris ce que tu voulais dire. Peux-tu
 expliquer ?

Sous Unix, il y a une limite à la longueur totale des arguments
d'un process. Cette limite s'appelle ARG_MAX (limits.h) et sa
valeur varie d'un système à l'autre. Sous Linux, elle était de 128 kB
aux dernières nouvelles. SUS dit que ARG_MAX doit être supérieure
ou égale à _POSIX_ARG_MAX, qui vaut 4 kB.

Il n'est pas prudent de faire « for v in `truc` » ou « foo * » si
on n'est pas sûr que l'expansion de « `truc` » ou « * » n'excèdera
pas _POSIX_ARG_MAX. Il vaut mieux utiliser xargs ou, si on ne peut
pas, « while read ». Dans le cas qui nous occupe,

  ls -t -r *.png |
  while IFS= read -r f
  do
mv $f ...
  done

Et attention : The number of bytes available for the new process'
combined argument and environment lists is {ARG_MAX}. It is
implementation-dependent whether null terminators, pointers,
and/or any alignment bytes are included in this total. Donc, dans
le cas le plus défavorable, 4 kB pour ARG_MAX, disons 1 kB
d'environnement, des noms de fichiers de deux caractères, quatre
octets par pointeur et un alignement à 16, on pourrait
parfaitement être limité à (4096 - 1024) / (16 + 4) = 153
arguments ce qui correspond à 306 caractères.

-- 
André Majorel http://www.teaser.fr/~amajorel/
The Debian project must be praised for their efforts in fighting spam by
flooding spammers with email addresses, some of which are even bogus.


-- 
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench   
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs From et
Reply-To:

To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]



Re: renommer en lot

2008-01-29 Par sujet Jack.R
On Tue, 29 Jan 2008 15:05:43 +0100
Andre Majorel [EMAIL PROTECTED] wrote:

  Un petit script bash (non testé, donc travailler sur une copie des
  images)
  
  #!/bin/sh
  count=0
  for item in `ls -t -r *.png`
  do
mv $item `printf %06d $count`.png
count=$(( $count + 1 ))
  done
 
 Il y a au moins un problème avec ce script ; la liste des fichiers
 à traiter doit tenir sur la ligne de commande.

Je viens de faires des essais avec une trentaine de fichier dont les
noms font environ 70 caractères, ls passe bien à la ligne mais cela
fonctionne. 
Cela cloche lorsqu'il y a des espaces dans le nom des fichiers à
traiter.

Je suis curieux et je n'ai pas compris ce que tu voulais dire. Peux-tu
expliquer ?

-- 
Jack.R



Re: renommer en lot

2008-01-29 Par sujet Jack.R
On Tue, 29 Jan 2008 22:24:21 +0100
Andre Majorel [EMAIL PROTECTED] wrote:

 On 2008-01-29 19:37 +0100, Jack.R wrote:

  Je suis curieux et je n'ai pas compris ce que tu voulais dire.
  Peux-tu expliquer ?
 
[ .. explication claire et détaillée .. ]

Merci beaucoup.

-- 
Jack.R



Re: renommer en lot

2008-01-28 Par sujet Frédéric BOITEUX
Le lun 28 jan 2008 00:11:58 CET, Remys Morrissette
[EMAIL PROTECTED] a écrit :

 Bonjour,
 
 j'ai une série de fichiers (+/- 25000)
 .
 que j'aimerais renommer de façon séquentiel
 dans le genre 1, 2, 3, , 25000
 ou encore, 01, 02, 03, ..., a1, a2, a3, , e...
 avec l'ordre par date si possible.
 
 des idées ?

Regarde le paquet « mmv » :

Déplace/copie/ajoute/lie plusieurs fichiers

mmv est un programme pour déplacer/copier/ajouter/lier plusieurs fichiers selon 
un jeu de motifs jokers. Toutes ces actions sont effectuées en toute sécurité, 
i.e. sans un effacement inexpliqué de fichiers dû à des collisions sur des noms 
de cibles avec des noms de fichiers existants ou avec d'autres noms de cibles. 

Fred.



Re: renommer en lot

2008-01-28 Par sujet Vincent Gay

Remys Morrissette a écrit :

j'ai une série de fichiers (+/- 25000)

../..

que j'aimerais renommer de façon séquentiel

dans le genre 1, 2, 3, , 25000

ou encore, 01, 02, 03, ..., a1, a2, a3, , e...

avec l'ordre par date si possible.

des idées ?

Remys


sudo apt-get install krename



renommer en lot

2008-01-27 Par sujet Remys Morrissette

Bonjour,

j'ai une série de fichiers (+/- 25000)

exemple :

0bf153bfa73346bafd4035908ff3a4fb.png   Wed Oct 24 00:16:57 2007
0bf30ca8b401ab42ad9adc8327ce8ac7.png Mon Sep 10 21:15:09 2007
acda647ce3d021a81e126f9ccc622139.png Tue May 22 21:17:32 2007
ace127012b35f74f29bf58a82268a98b.png Thu Apr 13 23:52:55 2006
e3e1602a552ffe15b446388239b9299d.png Sun Apr 15 22:36:11 2007
e3e3e4449d314d7abae0d1bba0acdc91.png Mon Sep 10 21:33:37 2007


que j'aimerais renommer de façon séquentiel

dans le genre 1, 2, 3, , 25000

ou encore, 01, 02, 03, ..., a1, a2, a3, , e...

avec l'ordre par date si possible.

des idées ?

Remys





--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench   
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs From et

Reply-To:

To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]



Re: renommer en lot

2008-01-27 Par sujet Jack.R
On Mon, 28 Jan 2008 00:11:58 -0500
Remys Morrissette [EMAIL PROTECTED] wrote:

 Bonjour,
 
 j'ai une série de fichiers (+/- 25000)
 
 exemple :
 
 0bf153bfa73346bafd4035908ff3a4fb.png   Wed Oct 24 00:16:57 2007
 0bf30ca8b401ab42ad9adc8327ce8ac7.png Mon Sep 10 21:15:09 2007
 acda647ce3d021a81e126f9ccc622139.png Tue May 22 21:17:32 2007
 ace127012b35f74f29bf58a82268a98b.png Thu Apr 13 23:52:55 2006
 e3e1602a552ffe15b446388239b9299d.png Sun Apr 15 22:36:11 2007
 e3e3e4449d314d7abae0d1bba0acdc91.png Mon Sep 10 21:33:37 2007
 
 
 que j'aimerais renommer de façon séquentiel
 
 dans le genre 1, 2, 3, , 25000
 
 ou encore, 01, 02, 03, ..., a1, a2, a3, , e...
 
 avec l'ordre par date si possible.
 
 des idées ?
 
 Remys
 
 

Bonjour,

Un petit script bash (non testé, donc travailler sur une copie des
images)

#!/bin/sh
count=0
for item in `ls -t -r *.png`
do
  mv $item `printf %06d $count`.png
  count=$(( $count + 1 ))
done

-- 
Jack.R



Re: renommer en lot

2008-01-27 Par sujet Francois Mescam

Remys Morrissette wrote:

Bonjour,

j'ai une série de fichiers (+/- 25000)

exemple :

0bf153bfa73346bafd4035908ff3a4fb.png   Wed Oct 24 00:16:57 2007
0bf30ca8b401ab42ad9adc8327ce8ac7.png Mon Sep 10 21:15:09 2007
acda647ce3d021a81e126f9ccc622139.png Tue May 22 21:17:32 2007
ace127012b35f74f29bf58a82268a98b.png Thu Apr 13 23:52:55 2006
e3e1602a552ffe15b446388239b9299d.png Sun Apr 15 22:36:11 2007
e3e3e4449d314d7abae0d1bba0acdc91.png Mon Sep 10 21:33:37 2007


que j'aimerais renommer de façon séquentiel

dans le genre 1, 2, 3, , 25000

ou encore, 01, 02, 03, ..., a1, a2, a3, , e...

avec l'ordre par date si possible.

des idées ?


Il y a metamorphose http://file-folder-ren.sourceforge.net/ pour cela.



Remys








--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench   
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs From et

Reply-To:

To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]