Commande Find

Résolu/Fermé
baygon_jaune Messages postés 11 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 25 novembre 2009 - 18 mars 2008 à 09:28
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 27 juil. 2008 à 09:08
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

10 réponses

Et si tu tentes ca :

ls -la alert* | grep -li Errors

??
0
baygon_jaune Messages postés 11 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 25 novembre 2009
18 mars 2008 à 09:50
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
18 mars 2008 à 10:35
hello
ls -al $(find /tmp -name 'alert*' -exec grep -li "Errors" {} \;)
0
baygon_jaune Messages postés 11 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 25 novembre 2009
18 mars 2008 à 11:40
C'est bon !

Grand Merci ! ;-)
0
baygon_jaune Messages postés 11 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 25 novembre 2009
24 juil. 2008 à 16:58
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
24 juil. 2008 à 17:22
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 11 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 25 novembre 2009
24 juil. 2008 à 18:02
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
26 juil. 2008 à 09:50
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 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567 > dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024
26 juil. 2008 à 13:00
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
26 juil. 2008 à 13:54
effectivement, j'ai mal interprété l'option grep -v
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
24 juil. 2008 à 18:53
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 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
26 juil. 2008 à 13:02
Salut,

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

0
baygon_jaune Messages postés 11 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 25 novembre 2009
26 juil. 2008 à 14:03
Grand merci, c'est exactement ce que je recherche : afficher les fichiers seulement "Errors" et non "Errors" + "titi"
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
27 juil. 2008 à 08:14
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 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
27 juil. 2008 à 09:08
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