Forum Programmation.shell Limite du shell pour le traitement de très nombreux fichiers

Posté par  .
Étiquettes : aucune
0
30
avr.
2007
Bonjour,

J'ai fait un script pour convertir des images jpeg en video grace à imageMagick.
Quand j'en traite une petite centaine de fichier, tout fonctionne a merveille avec le script ci dessous:
convert -delay 2 *.jpg video.mpg

Par contre je dois le faire avec 3000 fichiers par jour, mais a ce moment là, j'ai ce message d'erreur:
/usr/bin/convert: Argument list too long

J'ai vu sur des forum que l'on pouvais utiliser xargs, mais je ne sais pas coment l'adapter.

Votre aide me serait très utile.

Merci ;-)
  • # Juste pour dépanner ...

    Posté par  . Évalué à 3.

    En attendant de faire mieux,

    for i in *.jpg ; do convert -delay 2 -append $i video.mpg ; done

    doit peut-être marcher (jamais essayé append encore) ...
    Bonne chance.
    • [^] # Re: Juste pour dépanner ...

      Posté par  . Évalué à 1.

      Merci pour le tuyau mais ca ne fonctionne pas, ca doit rester sur le meme fichier .... car il me marque qu'il encode juste la premiere "frame" ... donc y'a un truc qui ne colle pas ;-)
      • [^] # Re: Juste pour dépanner ...

        Posté par  . Évalué à 2.

        Ou alors, il encode la dernière en écrasant à chaque fois la précédente, ce qui laisserait à penser que -append ne sert pas à ce que l'on croit ...

        Mais en tout cas, on a déporté la gestion des 3000 fichiers de convert vers bash, ce qui résoud déjà une partie du problème ...

        Je tâche de voir ça ce soir en rentrant si personne n'a trouvé la solution entre temps ...
  • # GIYF (GETA en français)

    Posté par  . Évalué à 2.

    http://www.google.fr/search?q=xargs+convert

    en cliquant sur le premier lien on a la réponse...

    au cas où voilà ce lien:
    http://www.developpez.net/forums/archive/index.php/t-5505.ht(...)
  • # mplayer-mencoder

    Posté par  . Évalué à 1.

    Sinon mencoder est capable de faire des films a partir d'images, je ne sais pas si il conviendrait a tes besoins :
    http://www.mplayerhq.hu/DOCS/HTML/fr/menc-feat-enc-images.ht(...)
    • [^] # Re: mplayer-mencoder

      Posté par  . Évalué à 1.

      Merci a tous pour vos contributions,

      avec tout ca j'ai tiré cette ligne:

      find / -name *.jpg -type f -print0 | xargs -0 convert -delay 2 video.mpg

      Et ca fonctionne :-)

      Merci encore pour votre aide.

      Ps: pour mencoder je n'ai pas encore testé ... mais je vais aller y faire un tour ;-)
      • [^] # Re: mplayer-mencoder

        Posté par  . Évalué à 1.

        En fait je me suis un peu avancé car il subsiste un bug:

        convert: unable to open image `/home/data/commun/webcam/video/29042007.mpg': Aucun fichier ou répertoire de ce type.
        convert: unable to open image `/home/data/commun/webcam/video/29042007.mpg': Aucun fichier ou répertoire de ce type.

        il y' a un truc qui ne va pas ... je cherche
      • [^] # Re: mplayer-mencoder

        Posté par  (site web personnel) . Évalué à 2.

        "find / -name *.jpg -type f -print0 | xargs -0 convert -delay 2 video.mpg"

        find / -name *.jpg -type f -exec convert -delay 2 {} video.mpg \;

        C'est déjà moins crade... enfin presque. ton problème est que avec ton * tu te retrouves avec tous les noms de fichiers sur une ligne. Donc que tu utilises * ou xargs, le problème finale sera le même. Il faut que tu trouves une commande qui n'ai pas besoin d'avoir tous les noms de fichier en une ligne.

        "La première sécurité est la liberté"

        • [^] # Re: mplayer-mencoder

          Posté par  . Évalué à 1.

          find / -name *.jpg -type f -exec convert -delay 2 {} video.mpg \;

          je mettrais plutôt ça:
          find . -name \*.jpg -type f -exec convert -delay 2 {} video.mpg \;

          le répertoire courant plutôt que la racine
          et un backslash devant l'* pour ne pas retomber sur le même problème
          et laisser find faire le boulot comme attendu.
      • [^] # Re: mplayer-mencoder

        Posté par  . Évalué à 3.

        Attention, avec cette commande :

        find / -name *.jpg

        tu récupères TOUS les fichiers .jpg qui se trouvent sur ton disque dur !

        Le deuxième paramètre de find est le répertoire d'où il commence sa recherche. Et en mettant "/", soit la racine du système de fichiers, tu obtiens tous les jpeg qui se trouvent sur ta machine, y compris des fonds d'écran ou illustration de docs se trouvant sous /usr.

        Doit être fun la vidéo ....
  • # Diviser pour reigner

    Posté par  (site web personnel) . Évalué à 4.

    J'aurais tendance à dire que si ça marche avec 100 mais pas avec 3000, fait 30 videos de 100 images puis concatène les .

    Cela te permet en outre de structurer ton script pour introduire un controle un gestion des erreurs.

    bon courrage

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.