Рекурсивно (много подкаталогов) находят файлы pdf и объединяются в один файл pdf (linux, bash) - PullRequest
0 голосов
/ 20 июня 2020

Удивительно, я видел много справочных страниц о том, как это сделать, из того же каталога. Те, которые рекурсивно используются, похоже, не работают для меня (попытки ниже) или требуют сложностей, которые я не хочу использовать, поскольку я их не понимаю (даже хуже, чем эти).

В общем , У меня есть PDF-файлы, разбросанные по многим поддиректориям, и я хочу go через каждый из них и объединить PDF-файлы в один большой PDF-файл.

В основном они пришли из:

https://unix.stackexchange.com/questions/298031/compress-all-pdf-files-recursively

Объединить / преобразовать несколько файлов PDF в один PDF

Первая попытка: (Это отлично работает, но только из каталога):

qpdf --empty --pages *.pdf -- out.pdf

at top level directory, this didn't work:

find . -type f -name "*.pdf" -exec bash -c 'qpdf --empty --pages "{}" -- merged.pdf;' {} \;

Вторая попытка:

find . -type f -name "*.pdf" | while read -r file; do pdfjam "$file" -o output.pdf; done

or

touch output.pdf
find . -type f -name "*.pdf" | while read -r file; do pdfjam "$file" output.pdf -o output.pdf; done

Третья попытка:

find . -type f -name "*.pdf" -exec bash -c 'pdftk "{}" cat output "new.pdf";' {} \;

or

touch new.pdf    
find . -type f -name "*.pdf" -exec bash -c 'pdftk "{}" new.pdf cat output "new.pdf";' {} \;

Четвертая попытка:

python3 -m pip install --user pdftools
pdftools merge --input-dir ./top_directory --output out.pdf

  usage: pdftools [-h] [-V] <command> ...
  pdftools: error: unrecognized arguments: --input-dir

Пятая попытка (кажется наиболее успешной, хотя выходной файл есть только страницы первого файла):

 find . -type f -name "*.pdf" -exec bash -c 'gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=out.pdf "{}";' {} \;

Я думал о различиях с find .... {} \; или find .... {} +, поэтому я тоже попробовал

Шестой атрибут:

find . -type f -name "*.pdf" -exec bash -c 'gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=out.pdf ;' {}  +

, в результате чего получилась пустая страница.

Мне ясно, что у меня проблемы с объединением файлов - вероятно y с помощью команды find -exec, и с различными инструментами проблем нет ....

EDIT

Думаю, я мог бы выполнить двухэтапную процедуру ,

find . -name "*pdf" -exec mv {} pdfs \;
qpdf --empty --pages *.pdf -- out.pdf

, но я хотел однострочник, но, что более важно, знаю, почему я использую find неправильно ...

EDIT 2

Мне действительно нужна только первая страница каждого файла, но это не имеет большого значения.

1 Ответ

1 голос
/ 22 июня 2020

Очень простое решение, в котором вместо имени используется iname (см. Man find).

I pu sh результат находится в / tmp /, чтобы не мешать, если вы запускаете команду несколько раз.

После вы должны скопировать /tmp/out.pdf туда, где вы хотите быть.

  qpdf --empty --pages \
     $( find . -iname '*.pdf' 2>/dev/null ) -- /tmp/out.pdf
...