Имена файлов теряются, когда я нахожу несколько файлов 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 параллельных процессов может быть смешанным.