Salut à tous,

J'ai tenté de comprendre comment utiliser grep, mais je n'arrive pas à trouver ce que je cherche.

J'ai un dossier contenant des centaines de documents. J'aimerai lancer une commande pour trouver tous les documents (word) qui contiennent un mot comme par exemple "honoraires".

J'ai tenté diverses commandes avec Grep, mais sans succèes.

Une idée ?
Euh je sais pas si c'est trop possible ça : les .doc sont compressés (je crois), donc essayer de trouver un mot dans un fichier texte compressé, ça relève de l'impossible (à moins qu'une commande sache lire les .doc, mais je ne connais pas...).

Grep ne sert qu'à "filtrer" le texte qui sera affiché sur le terminal. Il ne peut pas ouvrir de documents formatés de lui-même.
C'est plus le travail d'un indexeur genre Beagle ou Google desktop.
Tu as essayé

cat *.doc | grep -i honoraires

?
nouvo09 wrote:Tu as essayé

cat *.doc | grep -i honoraires

?
Ah nouvo tu fais partie des UUOC :hammer:

La même chose :
grep -i honoraires *.doc
Mais bon comme dit juste au dessus grep ne marchera pas sur des fichiers compressés...
Valdes wrote:Euh je sais pas si c'est trop possible ça : les .doc sont compressés (je crois), donc essayer de trouver un mot dans un fichier texte compressé, ça relève de l'impossible (à moins qu'une commande sache lire les .doc, mais je ne connais pas...).

Grep ne sert qu'à "filtrer" le texte qui sera affiché sur le terminal. Il ne peut pas ouvrir de documents formatés de lui-même.
Très juste remarque en effet. Le format .doc étant un format binaire, grep ne servira à rien ici appliqué directement sur de tels fichiers. Néanmoins il existe un convertisseur Word→ASCII : antiword, dans les dépôts :
for file in /dossier/contenant/les/fichiers/word/*.doc; do
   antiword "$i" | grep -qi "honoraires" && echo $i
done
antiword écrit, comme on s'en doutera, sur la sortie standard.
Il te reste à convertir tes *.doc en *.rft (Rich Text Format).

Tu devrais, alors, pouvoir faire un grep ...
En même temps, j'ai remarqué qu'en faisant un
$ cat fichier.doc
en plus d'afficher des caractères incompréhensibles, ça affichait bien la grande majorité des mots.

Donc le .doc ne doit pas être compressé.
Donc ton script, sans antiword, devrait relativement bien marcher :
for file in /dossier/contenant/les/fichiers/word/*.doc; do
   cat "$i" | grep -qi "honoraires" && echo $i
done
Valdes wrote: Donc le .doc ne doit pas être compressé.
Donc ton script, sans antiword, devrait relativement bien marcher :
for file in /dossier/contenant/les/fichiers/word/*.doc; do
   cat "$i" | grep -qi "honoraires" && echo $i
done
UUOC et boucle « inutile »... Quelle horreur. « grep -ri "honoraires" *.doc » suffirait ici.
Pas compressé, binaire. Il y a de la sérialisation dessous, c'est évident.
ça affichait bien la grande majorité des mots.
À défaut de spécifications ouvertes du format .doc, je ne me risquerais pas à une telle généralisation...
Merci pour vos réponses, je vais devoir tester tout ça !

@philippe_PMA
la raison pour laquelle j'ai besoin d'un bon outil de recherche, c'est qu'après la récupération de données avec photorec, il te balance tout dans un dossier, mais faut pouvoir retrouver tes petits.... car tout est renomé !

Pour la commande :
 cat "$i" | grep -qi "honoraires" && echo $i
Je n'ai pas très bien compris comment je dois l'utiliser ?

Je vais dans le dossier en ligne de commande et je tape la commande ? J'ai tenté la chose mais il ne se passse pas grand chose.

J'ai bien entendu installé "antiword".
Vaut mieux reprendre en entier ce qu'on te donne, ta ligne fait partie d'une boucle où est elle passé? Sinon ça peut suffir ça:
grep -Rl "honoraires" /ton_rep
Après tu n'as peut être pas compris ce qu'a dit Pikachu, c'est pas sur que le mot que tu recherches apparaisse en clair dans ton fichier. Fais un test, enregistre un .doc avec ton mot clef tu verras.
ok, j'ai bien compris, donc je prends la boucle complète :
for file in /dossier/contenant/les/fichiers/word/*.doc; do
   cat "$i" | grep -qi "honoraires" && echo $i
done
Tout en remettant le chemin correct.

Je sais juste pas comment la démarrer cette boucle !
ça démarre tout seul quand tu lance la commande.