Commande Find

Résolu
Bonjour,

Je suis débutant sous unix. Voici la commande me permettant de chercher dans /tmp tous les fichiers commençant par "alert" et qui ont la chaîne "Errors" :

find /tmp -name 'alert*' -exec grep -li "Errors" {} \;

Cette commande me retourne le nom du fichier répondant aux critères. Mais je cherche à intégrer un "ls -al" afin d'avoir + d'informations sur ces fichiers : les droits, la date de modification ...

Comment faire ?

Merci par avance.

Loïc
Configuration: Windows XP
Firefox 2.0.0.12

10 réponses

  1. Et si tu tentes ca :

    ls -la alert* | grep -li Errors

    ??
    1. Non, cela ne marche pas. Ta commande ne ramène rien alors que la mienne oui.

      Merci quand même.
  2. Contributeur
    hello
    ls -al $(find /tmp -name 'alert*' -exec grep -li "Errors" {} \;)
    1. C'est bon !

      Grand Merci ! ;-)
  3. Si le find ne ramène rien, la commande ls -al affiche tous les fichiers du rep courant. Qqun a t'il une idée pour ne pas exécuter le ls -al si le find ne récupère rien ?

    Merci par avance.

    Loïc
    1. Contributeur
      une possiblilité
      find /tmp -name 'alert*' -exec grep -li "Errors" {} \; > /tmp/log1
      test -s /tmp/log1 && { ls -al $(cat /tmp/log1) ; }
      1. Mille merci. J'obtiens j'obtiens presque ce que je recherche. Toutefois j'aimerais affiner ma recherche en affichant les fichiers qui contiennent la chaine "Errors" tout en ne contenant pas une autre chaine "titi".

        Merci par avance
        1. Contributeur
          une possiblilité mais il y a sûrement plus sophistiqué
          find /tmp -name 'alert*' -exec grep -li "Errors" {} \; > /tmp/log1
          if [ -s /tmp/log1 ] ; then
          	grep -ilv "titi" $(cat /tmp/log1) > /tmp/log2
          	cp /tmp/log2 /tmp/log1
          fi
          
          test -s /tmp/log1 && { ls -al $(cat /tmp/log1) ; }
          
        2. Modérateur
          @dubcekSalut,

          si j'ai bien compris alors ton script ne donne pas le résultat attendu
          vu que grep lit ligne par ligne, il va sauter les lignes avec titi mais le fichiers sera toujours afficher s'il y a le mot Errors
          lami20j@debian:~/trash$ cat ccm.sh
          #!/bin/bash
          
          find /tmp -name 'alert*' -exec grep -li "Errors" {} \; > /tmp/log1
          if [ -s /tmp/log1 ] ; then
                  grep -ilv "titi" $(cat /tmp/log1) > /tmp/log2
                          cp /tmp/log2 /tmp/log1
                          fi
          
                          test -s /tmp/log1 && { ls -al $(cat /tmp/log1) ; }
          
          lami20j@debian:~/trash$ cat /tmp/alert_rouge
          Errors
          titi
          $ cat /tmp/alert_orange
          Errors
          $ sh ccm.sh
          -rw-r--r-- 1 lami20j lami20j  7 2008-07-26 11:56 /tmp/alert_orange
          -rw-r--r-- 1 lami20j lami20j 12 2008-07-26 11:59 /tmp/alert_rouge
          $
          

          Les deus fichiers sont affichés puisque ce que tu exclus c'est la ligne avec titi mais pas le fichier.

          Je pense qu'il vaut mieux exclure d'abord les fichiers avec titi (qu'ils contient ou pas Errors) et ensuite chercher les fichiers avec Errors

          Un exemple incomplet
          $ cat /tmp/alert_orange
          Errors
          $ cat /tmp/alert_rouge
          Errors
          titi
          $ find /tmp -name 'alert*' -exec grep -li "titi" {} \;|xargs -I'f' mv f f_;find /tmp -name 'alert*[^_]' -exec grep -li 'Errors' {} \;
          /tmp/alert_orange
          

          Cette fois, seulement le fichier qui contient Errors sans avoir titi, est affiché.
        3. Contributeur
          @lami20jeffectivement, j'ai mal interprété l'option grep -v
      2. Modérateur
        Une autre possibilité :
        find /tmp -name 'alert*' -exec sh -c 'name=$(grep -li "Errors" "$1"); ls -al "$name" 2>/dev/null' _ {} \;
        ;-))
        1. Modérateur
          Salut,

          un autre possibilité ;-))
          find /tmp -name 'alert*' -exec grep -li "Errors" {} \;|xargs ls -l

          1. Grand merci, c'est exactement ce que je recherche : afficher les fichiers seulement "Errors" et non "Errors" + "titi"
            1. Contributeur
              Avec awk, qui affiche le nom du fichier si il contient error mais pas titi:
              for F in $(find /tmp -name 'alert*' -print) ; do
              awk 'BEGIN {IGNORECASE=1 ; e=0} ; /error/ {e=1} ; /titi/ {exit 1} ; END {if(e)print FILENAME}' $F ; done  | xargs ls -la
              1. Modérateur
                Pour ne pas être en reste... ;-))
                find /tmp -name 'alert*' -exec sh -c '\
                name=$(grep -li "Errors" "$1")
                nom=$(grep -L "titi" "$name")
                ls -al "$nom" 2>/dev/null' _ {} \;
                ;-))