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

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

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

Estou no desktop 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

Para onde vou aqui? Desde já, obrigado!

Responder1

Os arquivos ODT são, na verdade, arquivos Zip (consultehttps://stackoverflow.com/questions/4957212/how-does-open-office-compress-its-files) você deve ser capaz de cumprimentá-los com o zipgrepcomando algo assim:

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

Responder2

Supondo que você esteja usando o Bash 4, você pode fazer o seguinte:

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

Quando a opção shellestrela globestá definido,**corresponde recursivamente a todos os subdiretórios do diretório atual. O segundocomprarcomando desativa o comando; esta etapa é opcional.

Como aponta @vanthome, usar grep nos arquivos ODT não adianta nada, já que eles estão realmente compactados. Existem dois inconvenientes:

  1. OzipgrepO comando não usa mais de um nome de arquivo como argumento, então você precisa percorrer todos os arquivos ODT.
  2. zipgrepimprimirá apenas a linha correspondente (que pode sermuitolong 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

Oparaloop passa por todos os arquivos ODT em todos os subdiretórios. Para cada arquivo encontrado, ele descompacta seu conteúdo em STDOUT. Então,grepprocura a string desejada sem gerar nada ( -q). Se uma correspondência for encontrada,grepretorna 0 e o comando após o AND lógico ( &&) é executado, então o nome do arquivo é repetido no terminal.

informação relacionada