
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
,, scripts
etc.) 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 zipgrep
comando 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:
- ElzipgrepEl comando no toma más de un nombre de archivo como argumento, por lo que debe recorrer todos los archivos ODT.
- 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.