2012-07-12 10 views
9

Tengo una estructura de directorios llena de archivos de MS Word y tengo que buscar en el directorio una cadena en particular. Hasta ahora yo estaba usando el siguiente comando para buscar archivos en un directorioBuscar archivos de MS Word en un directorio para contenido específico en Linux

hallazgo. -exec grep -li 'search_string' {} \;

buscar. -name '*' -print | xargs grep 'search_string'

Pero esta búsqueda no funciona para los archivos de MS Word.

¿Es posible realizar búsquedas por cadenas en archivos de MS Word en Linux?

+0

Para ser claros, ¿qué versión de Word? El formato de archivo cambia significativamente de Office 2003 a Office 2007. –

+0

@DanielDiPaolo Revisé el tipo de archivo y dice 'Microsoft Office Word 97 - Documento 2003' – JoshMachine

Respuesta

0

¿Has probado con awk '/ Some | Word | In | Word /' document.docx?

+0

Probado no funciona. – JoshMachine

+0

Bueno, el truco está en la primera extracción del archivo doc (contiene document.xml) grep/awk es –

1

En un archivo .doc, el texto generalmente está presente y lo puede encontrar grep, pero ese texto está dividido e intercalado con códigos de campo e información de formato, por lo que es posible que no encuentre una frase que conozca. Una búsqueda de algo muy corto tiene más posibilidades de coincidir.

archivo Un .docx es en realidad un archivo zip recoger varios archivos juntos en una estructura de directorios (intentar cambiar el nombre de un .docx a .zip y luego descomprimirlo!) - con la compresión ZIP es poco probable que grep encontrará nada en absoluto.

+0

@ Stephen P Su archivo .doc y cualquier búsqueda de más de 3 caracteres no funciona. – JoshMachine

+0

@JoshMachine - como prueba, es posible que desee probar 'vim -bnR somefile.doc' en uno de ellos para ver lo que hay allí, luego intente buscar algo que vea en el archivo. –

0

Si ha instalado programa llamado Antiword puede utilizar este comando:

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

reemplazar "string_to_search" en el comando anterior con su texto. Este comando escupe nombre (s) de archivo de los archivos que contienen "string_to_search"

El comando no es perfecta porque funciona raro en todos los ficheros (el resultado puede ser untrustful), robaba para algunos antiword reseaon escupe este texto:

"Me temo que la secuencia de texto de este archivo es demasiado pequeña para manejar".

si el archivo es pequeño (lo que significa .o.)

+0

lee 'doc' pero no 'docx' –

+0

correctas (limitaciones de duo a * antiword *), tal vez esta https://github.com/rainey/antiword-xp-rb/wiki es la respuesta (aunque no tengo expierience con que hasta ahora) – xliiv

3

Las versiones más recientes de MS Word intercalar ascii [0] entre cada una de las letras del texto para fines que todavía no puedo entender. He escrito mis propias utilidades de búsqueda de MS Word que insertan ascii [0] entre cada uno de los caracteres en el campo de búsqueda y simplemente funciona bien. Torpe pero bien. Quedan muchas preguntas. Tal vez los personajes basura no son siempre lo mismo. Se necesitan hacer más pruebas. Sería bueno si alguien pudiera escribir una utilidad que tomaría todo esto en cuenta. En mi máquina de Windows, los mismos archivos responden bien a las búsquedas. ¡Podemos hacerlo!

11

Soy traductor y no sé casi nada sobre scripting, pero estaba tan enojado con grep que no podía escanear dentro de Word.doc files que encontré cómo hacer este pequeño script de shell para usar catdoc y grep para buscar un directorio de archivos .doc para una cadena de entrada dada.

Necesita instalar catdoc y docx2txt paquetes

#!/bin/bash 
echo -e "\n 
Welcome to scandocs. This will search .doc AND .docx files in this directory for a given string. \n 
Type in the text string 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 

Todas las mejoras y sugerencias Bienvenido!

+2

Eso es bastante impresionante. Así que puedo buscar múltiples subcarpetas y carpetas y ver dentro de .doc - También verificaría también para .docx. – TheBlackBenzKid

+0

Agregué soporte para docx usando docx2txt –

3

Aquí hay una manera de usar "descomprimir" para imprimir todo el contenido a la salida estándar, luego canalizar a "grep -q" para detectar si la cadena deseada está presente en la salida. Funciona para archivos de formato docx.

#!/bin/bash 
PROG=`basename $0` 

if [ $# -eq 0 ] 
then 
    echo "Usage: $PROG string file.docx [file.docx...]" 
    exit 1 
fi 

findme="$1" 
shift 

for file in [email protected] 
do 
    unzip -p "$file" | grep -q "$findme" 
    [ $? -eq 0 ] && echo "$file" 
done 

Guardar la secuencia de comandos como "inword" y busque "wombat" en tres archivos con:

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

Ahora sabes file2.docx contiene "wombat". Puede obtener más lujo agregando soporte para otras opciones de grep. Que te diviertas.

+0

¡Muy útil, gracias! –

1

La línea de comandos de código abierto utilidad crgrep buscará la mayoría de los formatos de documentos MS (yo soy el autor).

Cuestiones relacionadas