Herramienta de línea de comando para buscar frases en gran cantidad de archivos pdf

9

Estoy usando Opensuse 10.3 y me gusta conocer las herramientas de línea de comandos para buscar frases en una gran cantidad de archivos pdf dentro de un directorio. En Windows XP, la búsqueda del Explorador lo permite pero es demasiado lenta. ¿Hay consejos grep aquí?

repartidor de hielo
fuente
wingrep.com ! :)
Apache
Quiero conocer primero las herramientas de línea de comandos y si hay herramientas GUI, entonces también será bueno ... Wingrep solo está bajo Windows. Y quiero buscar solo archivos pdf, por lo que sería bueno tener una aplicación optimizada para eso
iceman
1
Pregunta similar en Unix Stack Exchange
Gilles 'SO- deja de ser malvado'

Respuestas:

6
SEARCH_DIR = "/ some / dir / where / you / want / to / search /";
SEARCH_STRING = "lo que sea que estés buscando";
# extracción de texto desde pdf
pdftotext "file.pdf" "file.txt"

# conectando con grep
pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" - "$ SEARCH_STRING"

# si desea que grep muestre solo la lista de archivos de archivos PDF coincidentes, agregue --files-with-match
pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" --files-with-match - "$ SEARCH_STRING"

# encontrar la posible lista de pdf para buscar
encuentre "$ SEARCH_DIR" -tipo f -name '* .pdf'> list-of-pdf.txt
# todo unido por awk como cinta adhesiva, enviado a bash para su procesamiento
# la comilla doble se escapa como x22 dentro de awk.
encuentre "$ SEARCH_DIR" -tipo f -name '* .pdf' | awk -v SEARCH_STRING = "$ SEARCH_STRING" '{
imprimir "pdftotext \ x22" $ 0 "\ x22 / dev / stdout | grep -H --label = \ x22" $ 0 "\ x22 - \ x22" SEARCH_STRING "\ x22"
} '| bash

# Sin fiesta. Proceso adicional para satisfacer sus necesidades.
encuentre "$ SEARCH_DIR" -tipo f -name '* .pdf' | awk -v SEARCH_STRING = "$ SEARCH_STRING" '
{
EXEC = "pdftotext \ x22" $ 0 "\ x22 / dev / stdout | grep -H --label = \ x22" $ 0 "\ x22 - \ x22" SEARCH_STRING "\ x22";
while (EXEC | getline ret) {
 print "Para el archivo [" $ 0 "] tenemos una coincidencia [" ret "]";
 # Haz lo que quieras. 
};
cerrar (EXEC);
} '
usuario42723
fuente
Supongo que no notó la parte de la pregunta que mencionaba "Windows XP" o la etiqueta de búsqueda de Windows . Sé que la pregunta (confusa) comenzó con "openSUSE" , pero hay más referencias de Windows que referencias de Linux; especialmente cuando cuentas su comentario posterior también.
Synetech
@Synetech: Rechazó una respuesta con "Wingrep solo está bajo Windows", lo que sugiere que quiere una solución Linux.
Caracol mecánico
@Mechanicalsnail, lo rechazó porque es una herramienta GUI donde ha pedido una herramienta de línea de comandos.
Synetech
3

Tanto en Linux como en Windows, puede usar Acrobat Reader, que tiene un comando para buscar múltiples archivos.

En Linux, hay Recoll, que creará un índice de sus archivos pdf (y más) la primera vez que lo ejecute. Una vez creado el índice, las búsquedas de palabras deben ser muy rápidas; Las búsquedas de frases deben ser razonables. Asegúrese de que el pdftotextcomando esté instalado antes de iniciar Recoll; bajo Debian y Ubuntu, está en el poppler-utilspaquete, no sé sobre Suse.

O bien, puede convertir directamente los archivos a texto y usar grep en los archivos de texto con los siguientes comandos.

find -name '* .pdf' -exec pdftotext {} \;
grep -r --incluye '* .txt' -l -F "frase exacta para buscar"
grep -r --incluye '* .txt' -l -E "expresión regular para buscar"
Gilles 'SO- deja de ser malvado'
fuente
Adobe no permitiría buscar en un directorio completo, lo haría solo dentro de un archivo. Quiero conocer primero las herramientas de línea de comandos y si hay herramientas GUI, entonces también será bueno
iceman
Adobe Reader 9 en Linux tiene una entrada de menú "Editar | Buscar" que le permite buscar en todos los archivos PDF en un directorio. En la línea de comando, todos los métodos que conozco implican un paso pdftotext(que herramientas como Recoll harán automáticamente).
Gilles 'SO- deja de ser malvado'
1
+1 para Recoll. La indexación de los archivos ahorrará tiempo si tiene mucho y los busca con frecuencia.
Caracol mecánico
1

Adobe Reader X hace el trabajo y lo hace permitir la búsqueda debajo de todo un directorio y subdirectorios, no sólo dentro de un archivo, pero no es un programa de línea de comandos.

stendabrog
fuente
¿Está eso en la última versión de Acrobat X? cual lanzamiento?
Iceman
Probé la herramienta de indexación de Acrobat y llamarlo primitivo es un cumplido. recollinstalado en Debian fácilmente, ahora tratando de hacerlo utilizable para mis empleados basados ​​en Windows.
Chris K
0

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 -execo xargsporque, 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.

James Haigh
fuente