Journal ls ???

Posté par  (site web personnel) .
Étiquettes : aucune
0
1
août
2003
J'ai voulu executer une commande toute bete sous ma RedHat preférée: ls

$ ls | wc
14223 14223 456221
$ ls *.hxx
bash: /bin/ls: Liste d'arguments trop longue

C'est fou qd meme, non ?
quelqu'un a une explication sur l'algo employé derrière ?
  • # Re: ls ???

    Posté par  . Évalué à 1.

    Ouaip, j'ai déjà essayé un
    $ rm -f *log # 3000 fichiers

    ls *.hxx
    est interpolé par bash en une ligne de commande trop longue pour qu'il puisse l'interpréter.
    Il doit y avoir quelque part un :
    #define BUFFER_L xxxxx
    char buffer[BUFFER_L] ;

    Solution :
    $ find . -name "*.hxx"
    • [^] # Re: ls ???

      Posté par  . Évalué à 3.

      Quand les "cmd *" ne fonctionnent pas à cause de ce pb, il faut faire un "find . | xargs cmd".
      En général on peut s'en sortir comme ça.
    • [^] # Re: ls ???

      Posté par  . Évalué à 1.

      il doit y avoir des docs sur les shell unix/posix quelque part sur le net (j'ai la flemme de chercher)

      mais en gros les caracteres spéciaux comme * sont remplacés par tous les noms qu'ils désignent, et tous ces arguments sont ensuite fournis à la commande de début de ligne (ici /bin/ls) dans les fameux parametres de la fonction C main(argc,argv)
      • [^] # Re: ls ???

        Posté par  . Évalué à 1.

        tiens, j'y pense maintenant, essaye la commande
        echo *.truc
        pour mieux comprendre ce qui se passe
  • # Re: ls ???

    Posté par  . Évalué à 4.

    $ ls
    C'est ls qui liste les entrées.

    $ ls *.hxx

    C'est bash qui substitue "*.hxx" par les noms des fichiers qui correspondent au motif.
    Tu peux essayer "echo *.hxx" et tu auras le même problème.

    Sinon bash doit passer par exec() pour lancer une commande :
    /usr/include/linux/limits.h :
    #define ARG_MAX 131072 /* # bytes of args + environ for exec() */
  • # Re: ls ???

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

    C'est ton shell qui veut pas passer tous ces arguments. Je ne sais pas quelle est la limite exacte et si c'est la longueur ou le nombre. Je pense plutot la longueur de la chaine totale.

    ls `seq -w 99999` passe (99999*6caracteres...)
    par contre ls `seq -w 100000` non (100000*7caracteres)
    • [^] # Re: ls ???

      Posté par  . Évalué à 2.

      J'ai utilisé ton test sur zsh

      la limite:

      ls `seq -w 21220` aaaa

      6 * 21220 + 6 = 127326

      Donc il y a quelque chose comme 128ko pour les arguments.
  • # Re: ls ???

    Posté par  . Évalué à 4.

    J'ai souvent eu le meme pb et je dois avouer que je n'avais pris la peine de chercher, alors voila les explications :
    http://mail.gnu.org/archive/html/bug-fileutils/2002-07/msg00035.htm(...)

    On peut donc remplacer la commande ls *.hxx par ls | xargs echo.

    Et obtenir la taille max des arguments par getconf ARG_MAX (en provenance directe du kernel)
  • # Re: ls ???

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

    En fait c'est le shell qui fait la substitution du *.hxx par les noms de fichiers correspondants. Si sur tes 14223 fichiers de ton repertoire tu as 14000 qui sont des .hxx, alors tu passes les 14000 noms de fichiers en paramètre de la commande ls. Et je ne sais pas à combien on a droit :)

    Comme dit un precedent commentaire, un find devrait faire l'affaire :)

Suivre le flux des commentaires

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