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 -
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
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
-
-
hello
ls -al $(find /tmp -name 'alert*' -exec grep -li "Errors" {} \;) -
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 -
une possiblilité
find /tmp -name 'alert*' -exec grep -li "Errors" {} \; > /tmp/log1
test -s /tmp/log1 && { ls -al $(cat /tmp/log1) ; } -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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-
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) ; }- 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 Errorslami20j@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é.
-
-
Une autre possibilité :
find /tmp -name 'alert*' -exec sh -c 'name=$(grep -li "Errors" "$1"); ls -al "$name" 2>/dev/null' _ {} \;;-))
-
Salut,
un autre possibilité ;-))find /tmp -name 'alert*' -exec grep -li "Errors" {} \;|xargs ls -l
-
Grand merci, c'est exactement ce que je recherche : afficher les fichiers seulement "Errors" et non "Errors" + "titi"
-
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 -
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' _ {} \;;-))