Commande Find

Résolu
baygon_jaune Messages postés 12 Statut Membre -  
jipicy Messages postés 41342 Statut Modérateur -
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
A voir également:

10 réponses

sebius
 
Et si tu tentes ca :

ls -la alert* | grep -li Errors

??
0
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
dubcek Messages postés 19021 Statut Contributeur 5 637
 
hello
ls -al $(find /tmp -name 'alert*' -exec grep -li "Errors" {} \;)
0
baygon_jaune Messages postés 12 Statut Membre
 
C'est bon !

Grand Merci ! ;-)
0
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
dubcek Messages postés 19021 Statut Contributeur 5 637
 
une possiblilité
find /tmp -name 'alert*' -exec grep -li "Errors" {} \; > /tmp/log1
test -s /tmp/log1 && { ls -al $(cat /tmp/log1) ; }
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
dubcek Messages postés 19021 Statut Contributeur 5 637
 
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
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570 > dubcek Messages postés 19021 Statut Contributeur
 
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
dubcek Messages postés 19021 Statut Contributeur 5 637 > lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité
 
effectivement, j'ai mal interprété l'option grep -v
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
Une autre possibilité :
find /tmp -name 'alert*' -exec sh -c 'name=$(grep -li "Errors" "$1"); ls -al "$name" 2>/dev/null' _ {} \;
;-))
0
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
Salut,

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

0
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
dubcek Messages postés 19021 Statut Contributeur 5 637
 
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
jipicy Messages postés 41342 Statut Modérateur 4 896
 
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