首页 > 解决方案 > 递归(许多子目录)查找pdf文件并合并为一个pdf文件(linux,bash)

问题描述

令人惊讶的是,我从同一个目录中看到了许多有关如何执行此操作的帮助页面。那些递归使用的似乎对我不起作用(下面的尝试),或者需要我不想使用的复杂性,因为我不了解它们(甚至比这些更糟糕)。

总而言之,我将 pdf 分散在许多子目录中,并希望浏览每个子目录并将 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 ;' {}  +

这产生了一个空白页。

我很清楚,我无法连接文件 - 可能使用find -exec命令,并且各种工具都没有问题......

编辑

我想我可以做一个两步程序,

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

但我想要一个单线,但更重要的是知道为什么我用find错了......

编辑 2

我真的只想要每个文件的第一页,但这没什么大不了的。

标签: bashfindexecpdftoolspdfjam

解决方案


一个非常简单的解决方案,即使用 iname 而不是 name(请参阅 man find)。

我推送结果在 /tmp/ 中,如果您多次运行该命令不会干扰。

在您必须将 /tmp/out.pdf 复制到您想要的位置之后。

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

推荐阅读