
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 zipgrep
comando 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:
- OzipgrepO comando não usa mais de um nome de arquivo como argumento, então você precisa percorrer todos os arquivos ODT.
- 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.