Por que meu grep recursivo não está funcionando?

1

Eu estou em um diretório pai e quero procurar por quaisquer arquivos ODT (LibreOffice Writer) que contenham a frase "GWT" neles.

Estou no desktop do Ubuntu 12.04. Do terminal:

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

Todos esses objetos do sistema de arquivos ( eclipse , scripts , etc.) são pastas.

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

Onde estou indo ary aqui? Obrigado antecipadamente!

    
por pnongrata 29.11.2013 / 19:36

2 respostas

3

Os arquivos ODT são, na verdade, arquivos Zip (consulte link ) deve ser capaz de usar o comando zipgrep com algo parecido com isto:

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

    
por 29.11.2013 / 20:54
0

Supondo que você use o Bash 4, faça o seguinte:

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

Quando a opção de shell globstar é definida, ** corresponde recursivamente a todos os subdiretórios do diretório atual. O segundo comando shopt desabilita o comando; este passo é opcional.

Como o @vanthome ressalta, usar os arquivos ODT não ajuda, já que eles são realmente compactados. Existem dois inconvenientes:

  1. O comando zipgrep não ocupa mais do que um nome de arquivo como argumento, portanto, é necessário percorrer todos os arquivos ODT.
  2. zipgrep imprimirá apenas a linha correspondente (que pode ser muito longa em um arquivo ODT), então você ainda não saberá quais arquivos contêm a string.

O seguinte pode alcançar os resultados desejados:

shopt -s globstar

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

shopt -u globstar

O loop para passa por todos os arquivos ODT em todos os subdiretórios. Para cada arquivo encontrado, ele descompacta seu conteúdo para STDOUT. Então, o grep procura a string desejada sem produzir nada ( -q ). Se uma correspondência for encontrada, o grep retornará 0 e o comando depois que o AND lógico ( && ) for executado, então o nome do arquivo será ecoado no terminal.

    
por 01.12.2013 / 01:33