[find] Bug ??

Bonjour,

J'ai des bugs bizarres avec la commande find :
Exemple :
find /home/outils/log -name *.txt
find: paths must precede expression
Usage: find [path...] [expression]

Par contre :
find /home/outils/log -name *.csv
ca marche !

J'ai pas mal de cas bizarres comme celui-ci, aussi bien sur une debian que sur une redhat !

Si vous avez des suggestions je suis preneur !

Thierry
Configuration: Windows XP
Firefox 2.0.0.4

8 réponses

  1. J'ajoute que si je mets des guillemets, çà marche:
    find /home/outils/log -name "*.txt"

    Mais dans un script ca ne marche plus :

    for i in `find /home/outils/log -name "*.txt"`;do
    echo $i
    done

    -> find: paths must precede expression
    Usage: find [path...] [expression]

    :-((
    0
    1. Contributeur
      Est-ce que le répertoire ou est exécutée la commande contient des fichiers .txt ?
      0
      1. Non, il n'en contient pas, mais il ne contient pas non plus de fichiers csv !
        0
        1. Webmaster
          Bonjour,

          Il ne contient pas non plus de fichiers cachés ?

          L'idéal, serait que tu nous donne le resultat complete des commandes suivantes (par copier/coller):
          $ ls -alR /home/outils/log
          $ find /home/outils/log -name *.txt
          $ find /home/outils/log -name *.csv
          @+

          0
          1. Contributeur
            Pour ne pas interprétée par le shell l'étoile du find DOIT être protégée:
            find -name \*.txt ...
            find -name "*.txt" ...
            find - name '*.txt' ...

            un alias peut-être ?
            \find /home/outils/log -name \*.txt

            quel find ?
            whereis find
            0
            1. ls -alR /home/outils/log
              /home/outils/log:
              total 268
              drwxrwx--- 2 outils www-data 16384 2007-07-16 10:11 .
              drwxr-xr-x 5 outils outils 4096 2007-07-16 12:05 ..
              -rw-rw-rw- 1 outils outils 250 2007-07-09 09:20 Log_REJEU_DISE_09072007.log
              -rw-rw-rw- 1 outils outils 250 2007-07-10 09:20 Log_REJEU_DISE_10072007.log
              -rw-rw-rw- 1 outils outils 186104 2007-07-11 10:37 Log_REJEU_DISE_11072007.log
              -rw-rw-rw- 1 outils outils 547 2007-07-12 10:48 Log_REJEU_DISE_12072007.log
              -rw-rw-rw- 1 outils outils 250 2007-07-13 09:20 Log_REJEU_DISE_13072007.log
              -rw-rw-rw- 1 outils outils 250 2007-07-14 09:20 Log_REJEU_DISE_14072007.log
              -rw-rw-rw- 1 outils outils 250 2007-07-15 09:20 Log_REJEU_DISE_15072007.log
              -rw-rw-rw- 1 outils outils 250 2007-07-16 09:20 Log_REJEU_DISE_16072007.log
              -rw-rw-rw- 1 outils outils 268 2007-07-09 09:20 Log_REJEU_DISE_BZH_09072007.log
              -rw-rw-rw- 1 outils outils 268 2007-07-10 09:20 Log_REJEU_DISE_BZH_10072007.log
              -rw-rw-rw- 1 outils outils 1914 2007-07-11 10:37 Log_REJEU_DISE_BZH_11072007.log
              -rw-rw-rw- 1 outils outils 583 2007-07-12 10:48 Log_REJEU_DISE_BZH_12072007.log
              -rw-rw-rw- 1 outils outils 268 2007-07-13 09:20 Log_REJEU_DISE_BZH_13072007.log
              -rw-rw-rw- 1 outils outils 268 2007-07-14 09:20 Log_REJEU_DISE_BZH_14072007.log
              -rw-rw-rw- 1 outils outils 268 2007-07-15 09:20 Log_REJEU_DISE_BZH_15072007.log
              -rw-rw-rw- 1 outils outils 268 2007-07-16 09:20 Log_REJEU_DISE_BZH_16072007.log

              (Pourquoi 268 ???)

              find /home/outils/log -name *.txt
              find: paths must precede expression
              Usage: find [path...] [expression]

              find /home/outils/log -name *.csv
              -> RIEN

              Si je fais un touch /home/outils/log/test.txt puis
              find /home/outils/log -name *.txt
              find: paths must precede expression
              Usage: find [path...] [expression]

              Par contre:
              find /home/outils/log -name \*.txt
              /home/outils/log/test.txt

              Je ne vois pas pourquoi il faut échapper * pour txt ??
              0
              1. Webmaster
                Bonche y'a un mystere là :)

                En fait, quand tu fais find [...] -name *.txt , si le repertoire contient des fichiers a.txt b.txt, l'expansion fait que ton find est en fait find [...] -name a.txt b.txt , c'est exactement le même fonctionnement qu'un ls *txt.

                Par contre, là, comme il n'y a pas de fichier *.txt ou .*.txt il y a un soucis :(

                Dans le doute, quer te donne la commande shopt, et quel interpreteur utilises tu (bash?) ?

                @+
                0
              2. Webmaster
                PS: le 268 c'est le nombre de block utilisés (en admettant que la taille d'un block soit de 1Ko)

                ++
                0
              3. shopt
                cdable_vars off
                cdspell off
                checkhash off
                checkwinsize on
                cmdhist on
                dotglob off
                execfail off
                expand_aliases on
                extglob off
                histreedit off
                histappend off
                histverify off
                hostcomplete on
                huponexit off
                interactive_comments on
                lithist off
                login_shell on
                mailwarn off
                no_empty_cmd_completion off
                nocaseglob off
                nullglob off
                progcomp on
                promptvars on
                restricted_shell off
                shift_verbose off
                sourcepath on
                xpg_echo off

                C'est bizarre, j'ai le meme souci sur une redhat (sur un autre motif de fichier et sur un autre répertoire)

                C'est encore plus bizarre que l'échappement devant * fonctionne: il ne devrait pas trouver avec
                find /home/ -name "\*.csv" ?
                0
            2. Webmaster
              Bingo! :)

              Je suis sous mac, donc je n'ai pas le même message exactement, mais le problème est le même, comme quoi 1 heure de métro, ça permet de réfléchir...
              PBG4:~ adrien$ mkdir -p test4tlep/home/outils/log
              PBG4:~ adrien$ cd test4tlep/
              PBG4:~/test4tlep adrien$ touch a.txt b.txt
              PBG4:~/test4tlep adrien$ for i in a b c d e f g h; do
              > touch home/outils/log/$i.log
              > done
              PBG4:~/test4tlep adrien$ find home/outils/log/ -name *.txt
              find: b.txt: unknown expression primary
              PBG4:~/test4tlep adrien$
              En gros, l'expansion est (très logiquement) faite dans le répertoire d'où est lancé le find :-)
              0
              1. Je ne comprends pas: "l'expansion est faite dans le répertoire d'où est lancé le find"

                Tu as compris le souci ??
                0
                1. Webmaster
                  Oui, j'ai compris (en tout cas, je le reproduit).

                  Si je reprend l'exemple que j'ai donné au dessus
                  #Création de l'arborescence de test
                  PBG4:~ adrien$ mkdir -p test4tlep/home/outils/log
                  PBG4:~ adrien$ cd test4tlep/
                  #Création dans le répertoire courant des fichier a.txt et b.txt
                  PBG4:~/test4tlep adrien$ touch a.txt b.txt
                  #Création des fichiers de log dans le répertoire cible de la commande find à jouer
                  PBG4:~/test4tlep adrien$ for i in a b c d e f g h; do
                  > touch home/outils/log/$i.log
                  > done
                  #Commande find a partir du repertoire test4tlep
                  PBG4:~/test4tlep adrien$ find home/outils/log/ -name *.txt
                  find: b.txt: unknown expression primary
                  #dans le repertoire test4tlep *.txt devient "a.txt b.txt" d'où l'erreur, c'est troublant parcequ'on demande a find de chercher dans un autre répertoire (home/outils/log/) mais il est tout a fait logique que l'expansion soit faite a partir du répertoire courant comme dans ls *.txt
                  PBG4:~/test4tlep adrien$
                  En gros, dans mon exemple, taper la commande find home/outils/log/ -name *.txt dans le répertoire test4tlep revient a taper la commande find . -name a.txt b.txt dans le répertoire test4tlep/home/outils/log/

                  Sinon, comment va ?
                  Toujours à Nantes ?
                  0
                2. On approche de l'explication.

                  En fait il y a 3 comptes root sur la machine:
                  root /root
                  root2 /home/root2
                  root3 /home/root3

                  (Tous les 3 ont UID=0)

                  Je m'aperçois que, quelque soit l'utilisateur (root, root2, root3), le find plante avec le motif "*.txt" dès qu'il est exécuté dans le répertoire /home/root2:

                  su root
                  cd /home/root2
                  find /home/outils/log -name *.txt
                  find: paths must precede expression
                  Usage: find [path...] [expression]
                  cd ..
                  find /home/outils/log -name *.txt
                  /home/outils/log/test.txt

                  C dingue hein ? :-))

                  -Ben non chuis a Redon en télétravail; et toi à toujours à Nantes ?
                  0
                3. Webmaster
                  @tlepPour le moment à Paris / La Défense dans une grosse SSII...
                  0