Commande Find

Résolu
baygon_jaune Messages postés 12 Statut Membre -  
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   -
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. sebius
     
    Et si tu tentes ca :

    ls -la alert* | grep -li Errors

    ??
    0
    1. baygon_jaune Messages postés 12 Statut Membre
       
      Non, cela ne marche pas. Ta commande ne ramène rien alors que la mienne oui.

      Merci quand même.
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    ls -al $(find /tmp -name 'alert*' -exec grep -li "Errors" {} \;)
    0
    1. baygon_jaune Messages postés 12 Statut Membre
       
      C'est bon !

      Grand Merci ! ;-)
      0
  3. baygon_jaune Messages postés 12 Statut Membre
     
    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
    0
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    une possiblilité
    find /tmp -name 'alert*' -exec grep -li "Errors" {} \; > /tmp/log1
    test -s /tmp/log1 && { ls -al $(cat /tmp/log1) ; }
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. baygon_jaune Messages postés 12 Statut Membre
     
    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
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      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) ; }
      
      0
      1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Salut,

        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é.
        0
      2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660 > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
         
        effectivement, j'ai mal interprété l'option grep -v
        0
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Une autre possibilité :
    find /tmp -name 'alert*' -exec sh -c 'name=$(grep -li "Errors" "$1"); ls -al "$name" 2>/dev/null' _ {} \;
    ;-))
    0
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

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

    0
  9. baygon_jaune Messages postés 12 Statut Membre
     
    Grand merci, c'est exactement ce que je recherche : afficher les fichiers seulement "Errors" et non "Errors" + "titi"
    0
  10. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
    0
  11. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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' _ {} \;
    ;-))
    0