¿Hay alguna manera de buscar archivos pdf usando el poder de grep, sin convertirlo primero a texto en Ubuntu?
¿Hay alguna manera de buscar archivos pdf usando el poder de grep, sin convertirlo primero a texto en Ubuntu?
Respuestas:
Instale el paquete pdfgrep
, luego use el comando:
find /path -iname '*.pdf' -exec pdfgrep pattern {} +
——————
La forma más simple es
pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf
pdfgrep
También tiene una bandera recursiva. Así que esta respuesta tal vez podría reducirse a: pdfgrep -R pattern /path/
. Aunque podría ser menos efectivo si revisa todos los archivos, incluso si no es un PDF. Y noto que tiene problemas con caracteres internacionales como å, ä y ö.
-n
opción es un profesional para pdfgrep, ya que permite incluir el número de página en la salida (puede ser útil para un procesamiento posterior).
pattern
? ¿Qué es {}
? ¿Qué pasa con el '+'? No tengo idea desde la primera lectura ... así que supongo que voy a la página del manual.
Si lo ha poppler-utils
instalado (predeterminado en el escritorio de Ubuntu), puede "convertirlo" sobre la marcha y canalizarlo a grep
:
pdftotext my.pdf - | grep 'pattern'
Esto no creará un archivo .txt.
pdftotext
es el nombre de archivo en el que debe escribir. Sin embargo, por convención, las herramientas generalmente le permiten escribir en stdout
lugar de en un archivo especificando un -
lugar. Del mismo modo, algunas herramientas escribirían stdout
de forma predeterminada si omite dicho argumento por completo (pero esto no siempre es posible sin crear ambigüedad).
pdfgrep fue escrito exactamente para este propósito y está disponible en Ubuntu.
Intenta ser principalmente compatible grep
y, por lo tanto, proporciona "el poder de grep", solo especializado para archivos PDF. Eso incluye opciones comunes de grep, como --recursive
, --ignore-case
o --color
.
En contraste con pdftotext | grep
, pdfgrep puede generar el número de página de una coincidencia de manera eficiente y generalmente es más rápido cuando no tiene que buscar en todo el documento (por ejemplo, --max-count
o --quiet
).
El uso básico es:
pdfgrep PATTERN FILE..
donde PATTERN
está su cadena de búsqueda y FILE
una lista de nombres de archivo (o comodines en un shell).
Vea la página de manual para más información.
No.
Un pdf consta de fragmentos de datos, algunos de ellos de texto, algunos de imágenes y algunos de ellos realmente mágicos XYZ (por ejemplo, archivos .u3d). Esos trozos se comprimen la mayoría de las veces (p. Ej. Plano, consulte http://www.verypdf.com/pdfinfoeditor/compression.htm ). Con el fin de 'grep' un .pdf que tiene para revertir la compresión también conocido como extraer el texto.
Puede hacerlo ya sea por archivo con herramientas tales como pdf2text
y grep el resultado, o ejecutar un 'paso a paso' (mira xapian.org o Lucene ), que construye un índice de búsqueda de los archivos .pdf y luego se puede usar la búsqueda herramientas del motor de ese indexador para obtener el contenido del pdf.
Pero no, no puede grep
archivos PDF y esperar respuestas confiables sin extraer primero el texto.
pdfgrep
en cuenta que existe (ver arriba), un "no" plano es incorrecto.
Recoll puede buscar archivos PDF. No admite expresiones regulares, pero tiene muchas otras opciones de búsqueda, por lo que puede satisfacer sus necesidades.
Puedes canalizarlo strings
primero: -
cat file.pdf | strings | grep <...etc...>
strings file.pdf | grep <...>
, no necesitacat
strings
o grep
.
Eche un vistazo al recurso común grep tool crgrep que admite búsquedas dentro de archivos PDF.
También permite buscar otros recursos como contenido anidado en archivos, tablas de bases de datos, metadatos de imágenes, dependencias de archivos POM y recursos web, y combinaciones de estos, incluida la búsqueda recursiva.
prueba esto
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \
pdftotext "$i" - | grep pattern; done
para imprimir las líneas el patrón ocurre dentro del pdf
cd a su carpeta que contiene su archivo pdf y luego ...
pdfgrep 'pattern' your.pdf
o si desea buscar en más de un solo archivo pdf (por ejemplo, en todos los archivos pdf de su carpeta)
pdfgrep 'pattern' `ls *.pdf`
o
pdfgrep 'pattern' $(ls *.pdf)
ls
salida como entrada para otros comandos . Solo pdfgrep 'pattern' *.pdf
es suficiente
Hay una pregunta duplicada en StackOverflow. La gente allí sugiere una variación de harish.venkarts responde:
find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;
La ventaja sobre la respuesta similar aquí es la --with-filename
bandera de grep. Esto es algo superior a pdfgrep también, porque el grep estándar tiene más características.
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
Aquí hay una secuencia de comandos rápida para buscar pdf en el directorio actual:
#!/bin/bash
if [ $# -ne 1 ]; then
echo "usage $0 VALUE" 1>&2
exit 1
fi
echo 'SEARCH IS CASE SENSITIVE' 1>&2
find . -name '*.pdf' -exec /bin/bash -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "$0"' $1 \;
Supongo que quiere decir que tp no lo convierte en el disco, puede convertirlos stdout
y luego grep pdftotext
. Agitar el pdf sin ningún tipo de conversión no es un enfoque práctico, ya que PDF
es principalmente un formato binario.
En el directorio:
ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword"
o en el directorio y sus subdirectorios:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword"
Además, debido a que algunos pdf
son escaneos, primero deben ser OCR. Escribí una forma bastante simple de buscar todos los archivos PDF que no se pueden grep
editar y OCR.
Noté que si un pdf
archivo no tiene ninguna fuente, generalmente no se puede buscar. Entonces, sabiendo esto, podemos usarlo pdffonts
.
Las primeras 2 líneas pdffonts
son el encabezado de la tabla, por lo que cuando se puede buscar un archivo tiene más de dos líneas de salida, sabiendo esto podemos crear:
gedit check_pdf_searchable.sh
luego pegue esto
#!/bin/bash
#set -vx
if ((`pdffonts "$1" | wc -l` < 3 )); then
echo $1
pypdfocr "$1"
fi
luego hazlo ejecutable
chmod +x check_pdf_searchable.sh
luego enumere todos los archivos PDF que no se pueden buscar en el directorio:
ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}
o en el directorio y sus subdirectorios:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}
Si solo desea buscar nombres / propiedades de pdf ... o cadenas simples que no están comprimidas o codificadas, en lugar de hacerlo strings
, puede usar el siguiente
grep -a STRING file.pdf
cat -v file.pdf | grep STRING
De grep --help
:
--binary-files=TYPE assume that binary files are TYPE;
TYPE is 'binary', 'text', or 'without-match'
-a, --text equivalent to --binary-files=text
y cat --help
:
-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB