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. 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' _ {} \;
    ;-))
    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. Grand merci, c'est exactement ce que je recherche : afficher les fichiers seulement "Errors" et non "Errors" + "titi"
        1. Modérateur
          Salut,

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

          1. Modérateur
            Une autre possibilité :
            find /tmp -name 'alert*' -exec sh -c 'name=$(grep -li "Errors" "$1"); ls -al "$name" 2>/dev/null' _ {} \;
            ;-))
            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. Contributeur
              une possiblilité
              find /tmp -name 'alert*' -exec grep -li "Errors" {} \; > /tmp/log1
              test -s /tmp/log1 && { ls -al $(cat /tmp/log1) ; }
              1. 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
                  hello
                  ls -al $(find /tmp -name 'alert*' -exec grep -li "Errors" {} \;)
                  1. C'est bon !

                    Grand Merci ! ;-)
                2. 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.