Как мне написать команду пакетного процесса, используя параллельный GNU?
Я пытаюсь выполнить пакетную обработку с помощью пакета под названием ocrmypdf.
Вот команда, которая может обрабатывать 1 файл PDF
ocrmypdf input.pdf output.pdf
и вот команда, которая может обрабатывать все файлы PDF в каталоге, в котором мы ее запускаем.
parallel --tag -j 2 ocrmypdf '{}' 'output/{}' ::: *.pdf
Теперь я действительно хочу запустить эту команду для всех файлов PDF в каталоге. Здесь требуется еще один параметр.
ocrmypdf --sidecar txt/input.txt input.pdf out/output.pdf
Ранее я пробовал переписать параллельную команду следующим образом:
parallel --tag -j 2 ocrmypdf --sidecar txt/{}.txt {}.pdf out/{}.pdf ::: *.pdf
Но получаю ошибку:
ocrmypdf: error: the following arguments are required: output_pdf
Может кто-нибудь помочь мне понять, что я делаю не так? Спасибо!
2 ответа
Это работает для меня:
parallel --tag -j 2 ocrmypdf --sidecar txt/{.}.txt {} out/{} ::: *.pdf
Если у вас не работает:
- Определите неисправный файл
- Запустите сбойный файл вручную, чтобы убедиться, что он работает.
- Измените свой вопрос, включив ссылку на файл с ошибкой
(Также помните об этой ошибке при запуске нескольких тессерактов: https://github.com/tesseract-ocr/tesseract/issues/3109#issuecomment-703845274)
Пытаться:
parallel --tag -j 2 ocrmypdf --sidecar txt/{.}.txt {} out/{} ::: *.pdf
Файлы .pdf после фигурных скобок являются посторонними и приведут к невозможности найти входные файлы, а для текстового - путем добавления точки внутри скобок, что автоматически удаляет расширение, поэтому вы получите .txt вместо файлов .pdf.txt (с теми же именами, что и входные)
ОБНОВЛЕНИЕ Нет, это тоже не совсем работает, у меня такая же ошибка, как и у вас. GNU p иногда может быть таким хитрым !!
Возможное решение
Я считаю, что это должно сработать. Чтобы избежать возни с кавычками, я сначала создал файл с именами всех pdf-файлов (полные относительные пути от cwd):
ls --color=none *.pdf | parallel -q printf '%s'\\n {} > ocrmypdf.list
Затем я запустил параллельный ocrmypdf следующим образом:
parallel -j 2 ocrmypdf --sidecar txt/{.} {} out/{} :::: ocrmypdf.list
У меня возникла ошибка, что в моем PDF-файле уже есть текст, но я думаю, что это сработало бы, если бы их еще не было. Каталоги txt и out уже должны были быть созданы. Обратите внимание на 4