Bonjour
je souhaite rechercher le mot toto dans tous les fichiers ascii du répertoire courant et de ses sous répertoires (autant les fichiers cachés que les sous-répertoires cachés)
Je sais que la commande serait qqch comme : grep -r toto *
(et encore, je ne suis pas sûr que cela prenne en compte les objets cachés)
Néanmoins comme mes sous-répertoires contiennent des fichiers binaires très volumineux (jusque 20 GB), pour pas que la recherche prennent des jours, il faudrait pouvoir lancer ce genre de commande avec un filtre sur la taille des fichiers à scanner (p.ex. < 1Mo) et/ou sur le type (ascii/binaire)
Qqn aurait il une idée ?
Merci d'avance
# man grep
Posté par JoeltheLion (site web personnel) . Évalué à 4.
Sinon pour inclure tous les fichiers, c'est grep -R toto . (. est le répertoire courant).
[^] # Re: man grep
Posté par Alex . Évalué à 6.
du type
find -size -1M -type f -exec grep toto '{}' \;
(de tête, commande non testée)
# find -size / grep -w
Posté par nono14 (site web personnel) . Évalué à 3.
-grep -w
et find -type -size
tu devrais trouver ton bonheur
Système - Réseau - Sécurité Open Source - Ouvert à de nouvelles opportunités
[^] # Re: find -size / grep -w
Posté par Nerdiland de Fesseps . Évalué à 1.
find . -size -1000k -type f -print0 2>/dev/null | xargs -0 -l10 grep -wiIl toto
explications :
find .
rechercher dans le dossier courant-size 1000k
les items de moins de 1000ko (chez moi non plus, "-1M" ne fonctionne pas correctement)-type f
qui sont des fichiers-print0
afficher le résultat avec le caractère NULL comme séparateur (moins de pb avec les noms de fichiers bizarres)2>/dev/null
ne pas afficher les erreurs (accès au fichier interdit, etc)xargs
prendre les résultats de la commande précédente et les ajouter en arguments de la commande suivante-0
les résultats sont séparés par le caractère NULL-l10
(optionnel, utile si tu as énormément de fichiers) traiter 10 résultats à la fois au lieu de tous à la foisgrep toto
rechercher la chaine toto-w
seulement si la chaîne recherchée est un mot entier (ignorera les correspondances à l'intérieur d'un mot)-i
ignorer la casse-I
ignorer les fichiers binaires-l
afficher le nom de fichier s'il y a correspondance, et seulement le nom de fichierEn jouant avec ça ça fonctionne dans la plupart des situations.
[^] # Re: find -size / grep -w
Posté par Nerdiland de Fesseps . Évalué à 1.
[^] # Re: find -size / grep -w
Posté par JoeltheLion (site web personnel) . Évalué à 2.
D'où l'intérêt d'utiliser plutôt un grep récursif, si possible.
# Avec find et xargs
Posté par Florian Hatat . Évalué à 4.
find -size -1M -print0 | xargs -0 grep -I
L'option -size de find permet de limiter la recherche aux fichiers d'une certaine taille : +1M pour limiter au fichiers de plus d'un méga, et -1M pour les fichiers de moins d'un mégaoctet.
L'option -print0 sépare les noms des fichiers trouvés par le caractère nul, plutôt que par des retours à la ligne : c'est plus facile de gérer ainsi les noms de fichiers avec espaces. Elle va de paire avec l'option -0 de xargs, qui informe xargs que le caractère de séparation en entrée est ce 0 (sinon par défaut, c'est le retour à la ligne, comme pour find).
Enfin, l'option -I de grep lui dit de considérer que les fichiers binaires ne contiennent jamais le motif (GNU grep a une petite heuristique pour détecter les fichiers binaires).
Plus de précision dans les pages de manuel correspondantes ensuite. :-)
[^] # Re: Avec find et xargs
Posté par tomtemporaire . Évalué à 1.
Qq commentaires et 1 question :
- avec find -type f -exec grep toto {} \; , ça marche, sauf que ça ne me donne pas en mm temps le nom du fichier qui a trouvé cette occurrence
- avec le script shell, il y a une erreur (while : Expression Syntax), mais bon, je m'y connais pas en script shell
- mon linux (en C-shell) ne reconnait pas l'option -1M, mais ça marche avec -1000k :)
- question: je suis pas sûr de comprendre comment marche exec dans -exec grep toto {} \;
En fait que vaut dire exactement la partie {} \; ??
En tous cas merci à tous
[^] # Re: Avec find et xargs
Posté par Alex . Évalué à 2.
alors pour le '{}' \; :
le {} est remplacé par le fichier que find aura trouvé
le ; indique la fin de la commande à éxectuter, le '\' sert à éviter l'interpretation par le shell
donc si tu as comme fichiers:
./toto
./titi
./tata
find exectutera:
grep toto ./toto
grep toto ./tata
grep toto ./titi
tu peux trouver dans le man de find des exemples plus interessants
# Commencer par find
Posté par Pierre Jarillon (site web personnel) . Évalué à 1.
find repertoire1 repertoire2 -P -type f -size -20M -exec grep toto {} \;
Ou encore
find rep1 rep2 -P -type f -size -20M -print | while read f
do
grep toto $f
done
et on peut faire plein de choses dans la boucle.
Attention, je n'ai pas testé, man find !
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.