para - word en linux como se llama
Buscar archivos de MS Word en un directorio para contenido especĂfico en Linux (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 estaba usando el siguiente comando para buscar archivos en un directorio
encontrar . -exec grep -li ''search_string'' {} /;
encontrar . -name ''*'' -print | xargs grep ''search_string''
Pero esta búsqueda no funciona para archivos de MS Word.
¿Es posible hacer una búsqueda de cadenas en archivos de MS Word en Linux?
¿Has probado con awk ''/ Some | Word | In | Word /'' document.docx?
En un archivo .doc
, el texto generalmente está presente y se puede encontrar en grep, pero ese texto está dividido e intercalado con códigos de campo e información de formato, por lo que es posible que la búsqueda de una frase que conozca no coincida. Una búsqueda de algo muy corto tiene más posibilidades de coincidir.
Un archivo .docx
es en realidad un archivo comprimido que recopila varios archivos en una estructura de directorio (intente cambiar el nombre de un archivo .docx a .zip y luego descomprimirlo): con la compresión zip es poco probable que grep encuentre nada.
Esta es una forma 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 $@
do
unzip -p "$file" | grep -q "$findme"
[ $? -eq 0 ] && echo "$file"
done
Guarde el script como "inword" y busque "wombat" en tres archivos con:
$ ./inword wombat file1.docx file2.docx file3.docx
file2.docx
Ahora sabes que file2.docx contiene "wombat". Puede obtener más lujo agregando soporte para otras opciones de grep. Que te diviertas.
La mejor solución que encontré fue usar unoconv
para convertir los documentos Word a html. También tiene una salida .txt, pero ese contenido se cayó en mi caso.
La utilidad de línea de comando opensource crgrep buscará en la mayoría de los formatos de documentos MS (soy el autor).
Las versiones más recientes de MS Word intercalan 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!
Si no se trata de demasiados archivos, puede escribir un script que incorpore algo como catdoc: http://manpages.ubuntu.com/manpages/gutsy/man1/catdoc.1.html , haciendo un bucles sobre cada archivo, realizando un catdoc y grep , almacenar eso en una variable bash, y sacarlo si es satisfactorio.
Si tiene un programa instalado llamado antiword , puede usar este comando:
find -iname "*.doc" |xargs -I {} bash -c ''if (antiword {}|grep "string_to_search") > /dev/null 2>&1; then echo {} ; fi''
reemplace "string_to_search" en el comando anterior con su texto. Este comando escupe nombre (s) de archivo de archivos que contienen "string_to_search"
El comando no es perfecto porque funciona de forma extraña en archivos pequeños (el resultado puede ser poco confiable ), ya que algunos rescates de palabra inversa este texto:
"Me temo que el flujo de texto de este archivo es demasiado pequeño para manejarlo".
si el archivo es pequeño (lo que signifique .o)
Soy traductora y no sé casi nada sobre scripting, pero estaba tan enojado con grep al no poder escanear dentro de archivos .doc de Word que resolví cómo hacer este pequeño script de shell para usar catdoc y grep para buscar en un directorio de archivos .doc para una cadena de entrada dada.
Necesita instalar los paquetes catdoc
y docx2txt
#!/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 son bienvenidas!