¿Por qué mi grep recursivo no funciona?

¿Por qué mi grep recursivo no funciona?

Estoy en un directorio principal y quiero buscar archivos ODT (LibreOffice Writer) que contengan la frase "GWT".

Estoy en el escritorio Ubuntu 12.04. Desde la terminal:

myUser@myMachine:~/sandbox$ pwd
/home/myUser/sandbox
myUser@myMachine:~/sandbox$ ls
cloudflip  doctrang  eclipse   lookslike  scripts       squirrel  warlib

Todos estos objetos del sistema de archivos ( eclipse,, scriptsetc.) son carpetas.

myUser@myMachine:~/sandbox$ grep -i -r "GWT" *.odt
grep: *.odt: No such file or directory

¿Adónde voy aquí? ¡Gracias de antemano!

Respuesta1

Los archivos ODT son en realidad archivos Zip (consultehttps://stackoverflow.com/questions/4957212/how-does-open-office-compress-its-files) deberías poder manipularlos con el zipgrepcomando algo como esto:

find ~/sandbox -name "*.odt" -type f -print0 | xargs -0 zipgrep GWT

Respuesta2

Suponiendo que esté utilizando Bash 4, puede hacer lo siguiente:

shopt -s globstar
grep -i GWT **/*.odt
shopt -u globstar

Cuando la opción Shellestrella globularEstá establecido,**coincide recursivamente con todos los subdirectorios del directorio actual. El segundocomprarcomando desarma el comando; Este paso es opcional.

Como señala @vanthome, recuperar los archivos ODT no servirá de nada, ya que en realidad están comprimidos. Hay dos inconvenientes:

  1. ElzipgrepEl comando no toma más de un nombre de archivo como argumento, por lo que debe recorrer todos los archivos ODT.
  2. zipgrepimprimirá sólo la línea coincidente (que puede sermuyde largo en un archivo ODT), por lo que aún no sabrá qué archivos contienen la cadena.

Lo siguiente podría lograr los resultados deseados:

shopt -s globstar

for file in **/*.odt; do
    unzip -c "$file" | grep -iq GWT && echo "$file"
done

shopt -u globstar

ElparaEl bucle recorre todos los archivos ODT en todos los subdirectorios. Para cada archivo que se encuentra, descomprime su contenido en STDOUT. Entonces,grepbusca la cadena deseada sin generar nada ( -q). Si se encuentra una coincidencia,grepdevuelve 0 y &&se ejecuta el comando después del AND lógico ( ), por lo que el nombre del archivo se repite en la terminal.

información relacionada