Имена файлов теряются, когда я нахожу несколько файлов pdf, xarg pdftotext и шаблон grep

Я хочу сделать сценарий оболочки для поиска шаблонов в PDF-файлах (сделать их своего рода корпусом для себя!!)

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

Как искать содержимое нескольких файлов PDF?

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

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

Это не должно быть "одной строкой".

Спасибо.

2 ответа

Решение

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

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

РЕДАКТИРОВАТЬ: я только заметил, что пример включал параллельную команду 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 "$@" || exit 255' arg0 {}

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

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

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 параллельных процессов может быть смешанным.

Другие вопросы по тегам