[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: