Para enumerar recursivamente todos los archivos en su directorio de inicio que tienen la extensión de archivo PDF y que contienen una línea que coincide con la expresión regular ' [iI]n Haskell
', por ejemplo, puede emitir:
find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir sh -c 'pdftotext "$0" - | grep -El --label="$PWD${0#?}" "$1"' {} '[iI]n Haskell' \;
Observaciones:
- Aunque no es particularmente necesario para este ejemplo, he construido esto evitando el uso
-exec
o xargs
porque, por razones de seguridad , creo que es una buena práctica adquirir el hábito de hacerlo. Cambiar ' -execdir
' a ' -exec
' y ' $PWD${0#?}
' a ' $0
' debería lograr el mismo resultado en esta instancia.
- En lugar de utilizar globos para la coincidencia de patrones con los nombres de archivo, puede ser útil utilizar el mayor poder expresivo de las expresiones regulares y la coincidencia de patrones en toda la ruta. Incluí la práctica aquí para mostrar cómo se puede hacer. Tenga en cuenta que la ruta que coincide con el patrón es la ruta que normalmente se imprimiría. Si es relativo o absoluto depende de los argumentos de ruta dados, que si se emiten por defecto al directorio de trabajo actual ('
./
'). En este ejemplo, las rutas coincidentes son todas absolutas (es decir, comienzan con ' /
') porque ' ~/
' se expande a la ruta absoluta del directorio de inicio del usuario actual, y es el único argumento de ruta.
- El '
$0
' y el ' $1
' son parámetros posicionales que se utilizan para citar correctamente los argumentos. Si esto no se hace correctamente, el comando es vulnerable a nombres de archivo arbitrarios.
- '
${0#?}
' elimina el primer carácter de $0
, es decir, el ' .
'.
Para imprimir cada línea coincidente, proceda por el nombre del archivo:
find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir bash -c 'pdftotext "$0" - | grep -EH --label="${0:2}" "$1"' {} '[iI]n Haskell' \;
Esta variante usa ' -H
' en lugar de ' -l
' y etiquetas con nombre de archivo en lugar de ruta de archivo. ' ${0:2}
' quita los dos primeros caracteres de $0
, es decir, el ' ./
', pero aparentemente no es reconocido por sh
.
Por supuesto, ajusta tus necesidades.