Para listar recursivamente todos os arquivos no diretório inicial que possuem a extensão de arquivo PDF e que contêm uma linha que corresponde à regex ' [iI]n Haskell', por exemplo, você pode emitir:
find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir sh -c 'pdftotext "$0" - | grep -El --label="$PWD${0#?}" "$1"' {} '[iI]n Haskell' \;
Observações:
- Embora não seja particularmente necessário para este exemplo, eu criei isso evitando o uso
-execou xargsporque, por razões de segurança , acho que é uma boa prática adquirir o hábito de fazê-lo. Alterar ' -execdir' para ' -exec' e ' $PWD${0#?}' para ' $0' deve atingir o mesmo resultado neste caso.
- Em vez de usar globs para fazer a correspondência de nomes de arquivos com padrões, pode ser útil usar o maior poder expressivo das expressões regulares e fazer a correspondência de padrões em todo o caminho. Incluí a prática aqui para mostrar como isso pode ser feito. Observe que o caminho que corresponde ao padrão é o caminho que normalmente seria impresso. Se é relativo ou absoluto, depende do (s) argumento (s) do caminho fornecido (s), que se emitidos por padrão para o diretório de trabalho atual ('
./'). Neste exemplo, os caminhos comparados são todos absolutos (ou seja, começam com ' /') porque ' ~/' é expandido para o caminho absoluto do diretório inicial do usuário atual e é o único argumento do caminho.
- Os '
$0' e ' $1' são parâmetros posicionais usados de forma a citar corretamente os argumentos. Se isso não for feito corretamente, o comando estará vulnerável a nomes de arquivos arbitrários.
- '
${0#?}' retira o primeiro caractere de $0, ou seja, o ' .'.
Para imprimir cada linha correspondente prosseguida pelo nome do arquivo:
find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir bash -c 'pdftotext "$0" - | grep -EH --label="${0:2}" "$1"' {} '[iI]n Haskell' \;
Essa variante usa ' -H' em vez de ' -l' e rotula com nome de arquivo em vez de caminho de arquivo. ' ${0:2}' retira os dois primeiros caracteres de $0, ou seja, o ' ./', mas aparentemente não é reconhecido por sh.
Obviamente, ajuste suas necessidades.