[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

  • Votes
  • Date
  • Date décroissante
  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]

    :-((
    1. Contributeur
      Est-ce que le répertoire ou est exécutée la commande contient des fichiers .txt ?
      1. Non, il n'en contient pas, mais il ne contient pas non plus de fichiers csv !
        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
          @+

          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
            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 ??
              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?) ?

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

                ++
              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" ?
            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 :-)
              1. Je ne comprends pas: "l'expansion est faite dans le répertoire d'où est lancé le find"

                Tu as compris le souci ??
                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 ?
                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 ?
                3. Webmaster
                  @tlepPour le moment à Paris / La Défense dans une grosse SSII...