2015-04-23 3 views
0

я хочу сделать скрипт для поиска шаблона в PDF-файлов (чтобы сделать их вид корпуса для себя !!)Имена файлов теряются, когда я нахожу несколько файлов PDF, xarg pdftotext и Grep шаблон

Я украл следующий фрагмент здесь

How to search contents of multiple pdf files?

find /path/to/folder -name '*.pdf' | xargs -P 6 -I % pdftotext % - | grep -C1 --color "pattern" 

и вывод выглядит следующим образом

-- 
-- 
small deviation of γ from the average value 0.33 triggers 
a qualitative difference in the evolution pattern, even if the 

Могу ли я сделать эту команду для печати имени файла?

Это не должно быть «однострочным».

спасибо.

+0

Трубы не будут работать, вам придется написать какой-то цикл. – pacholik

ответ

1

Не так много. Просто разделите команду на цикл.

find /path/to/folder -name '*.pdf' | while read file 
do 
echo "$file" 
pdftotext "$file" | grep -C1 --color "pattern" && echo "$file" 
done 

EDIT: Я только что заметил, что пример включает параллельную команду xargs. Это невозможно решить в цикле. Вы можете написать команду pdftotext & Grep в функции, а затем использовать xargs

edit2: только распечатать файл, когда есть совпадение

это может выглядеть примерно так:

#!/bin/bash 

files=$(find /path/to/folder -name '*.pdf') 

function PDFtoText 
{ 

file="$1" 

if [ "$#" -ne "1" ] 
then 
    echo "Invalid number of input arguments" 
    exit 1 
fi 

pdftotext "$file" | grep -C1 --color "pattern" && echo "$file" 

} 
export -f PDFtoText 


printf "%s\n" ${files[@]} | xargs -n1 -P 6 -I '{}' bash -c 'PDFtoText "[email protected]" || exit 255' arg0 {} 

if [[ $? -ne 0 ]] 
then 
exit 1 
fi 
+0

Пробовал это и распечатывает все имена файлов. Могу ли я печатать файлы, имеющие хотя бы одно совпадение? – omyojj

+0

Да, это хороший момент. Простая команда && после grep делает этот трюк. Ред. – nln

0

Почему бы не использовать что-то вроде

find /path/to/folder/ -type f -name '*.pdf' -print0 | \ 
    xargs -0 -I{} \ 
    sh -c 'echo "===== file: {}"; pdftotext "{}" - | grep -C1 --color "pattern"' 

Он всегда печатает имя файла. Считаете ли вы, что это приемлемый компромисс? В противном случае часть echo может быть перемещена после grep с номером &&, как было предложено ранее.

Я предпочитаю использовать -print0 в сочетании с -0, чтобы иметь дело с именами файлов с пробелами.

Я бы удалил опцию -P6, потому что выход из 6 процессов параллельно мог быть смешанным.