Re: renommer en lot
On 2008-01-29 19:37 +0100, Jack.R wrote:
> On Tue, 29 Jan 2008 15:05:43 +0100
> Andre Majorel <aym-naibed@teaser.fr> 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.
Reply to: