Rechercher des fichiers MS Word dans un répertoire pour un contenu spécifique sous Linux

J’ai une structure de répertoires pleine de fichiers MS Word et je dois rechercher dans le répertoire une chaîne particulière. Jusqu’à présent, j’utilisais la commande suivante pour rechercher des fichiers dans un répertoire

trouver . -exec grep -li ‘search_ssortingng’ {} \;

trouver . -name ‘*’ -print | xargs grep ‘search_ssortingng’

Mais, cette recherche ne fonctionne pas pour les fichiers MS Word.

Est-il possible de faire une recherche de chaîne dans des fichiers MS Word sous Linux?

Je suis un traducteur et je ne sais presque rien sur les scripts, mais j’étais tellement énervé que grep ne soit pas capable d’parsingr les fichiers Word .doc que j’ai trouvé comment créer ce petit script shell pour utiliser catdoc et grep dans un répertoire. de fichiers .doc pour une chaîne d’entrée donnée.

Vous devez installer les catdoc et docx2txt

 #!/bin/bash echo -e "\n Welcome to scandocs. This will search .doc AND .docx files in this directory for a given ssortingng. \n Type in the text ssortingng you want to find... \n" read response find . -name "*.doc" | while read i; do catdoc "$i" | grep --color=auto -iH --label="$i" "$response"; done find . -name "*.docx" | while read i; do docx2txt < "$i" | grep --color=auto -iH --label="$i" "$response"; done 

Toutes les améliorations et suggestions sont les bienvenues!

Les versions plus récentes de MS Word intercalent des ascii [0] entre chacune des lettres du texte à des fins que je ne peux pas encore comprendre. J’ai écrit mes propres utilitaires de recherche MS Word qui insèrent ascii [0] entre chacun des caractères dans le champ de recherche et cela fonctionne très bien. Maladroit mais OK. Beaucoup de questions restnt. Peut-être que les caractères indésirables ne sont pas toujours les mêmes. Plus de tests doivent être effectués. Ce serait bien si quelqu’un pouvait écrire un utilitaire qui tiendrait compte de tout cela. Sur ma machine Windows, les mêmes fichiers répondent bien aux recherches. On peut le faire!

Voici un moyen d’utiliser “unzip” pour imprimer tout le contenu sur la sortie standard, puis de “grep -q” pour détecter si la chaîne désirée est présente dans la sortie. Cela fonctionne pour les fichiers au format docx.

 #!/bin/bash PROG=`basename $0` if [ $# -eq 0 ] then echo "Usage: $PROG ssortingng file.docx [file.docx...]" exit 1 fi findme="$1" shift for file in $@ do unzip -p "$file" | grep -q "$findme" [ $? -eq 0 ] && echo "$file" done 

Enregistrez le script sous le nom “inword” et recherchez “wombat” dans trois fichiers contenant:

 $ ./inword wombat file1.docx file2.docx file3.docx file2.docx 

Maintenant, vous savez que file2.docx contient “wombat”. Vous pouvez devenir plus sophistiqué en ajoutant un support pour les autres options de grep. S’amuser.

Dans un fichier .doc , le texte est généralement présent et peut être trouvé par grep, mais ce texte est divisé et entrecoupé de codes de champ et d’informations de formatage. La recherche d’une phrase que vous connaissez peut ne pas correspondre. Une recherche de quelque chose de très court a de meilleures chances de correspondre.

Un fichier .docx est en fait une archive zip regroupant plusieurs fichiers dans une structure de répertoire (essayez de renommer un fichier .docx en .zip puis décompressez-le!) – avec la compression zip, il est peu probable que grep trouve quelque chose.

L’utilitaire de ligne de commande opensource crgrep recherchera la plupart des formats de document MS (je suis l’auteur).

Avez-vous essayé avec awk ‘/ Some | Word | In | Word /’ document.docx?

Si ce n’est pas trop de fichiers, vous pouvez écrire un script incorporant quelque chose comme catdoc: http://manpages.ubuntu.com/manpages/gutsy/man1/catdoc.1.html , en passant en boucle sur chaque fichier, en transformant un catdoc et un grep , en le stockant dans une variable bash, et en le produisant s’il est satisfaisant.

Si vous avez installé le programme appelé antiword, vous pouvez utiliser cette commande:

 find -iname "*.doc" |xargs -I {} bash -c 'if (antiword {}|grep "ssortingng_to_search") > /dev/null 2>&1; then echo {} ; fi' 

remplacez “ssortingng_to_search” dans la commande ci-dessus par votre texte. Cette commande crache les noms de fichiers de fichiers contenant “ssortingng_to_search”

La commande n’est pas parfaite car elle fonctionne de façon bizarre sur de petits fichiers (le résultat peut être peu fiable ), car pour certaines recherches, antiword spits ce texte:

“J’ai peur que le stream de texte de ce fichier soit trop petit pour être traité.”

si le fichier est petit (quoi que cela signifie .o)

La meilleure solution est d’utiliser unoconv pour convertir les documents Word en HTML. Il a également une sortie .txt, mais qui a laissé tomber le contenu dans mon cas.

http://linux.die.net/man/1/unoconv