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
-exec
ou xargs
porque, 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.