递归(许多子目录)查找pdf文件并合并为一个pdf文件(linux,bash)

Posted

技术标签:

【中文标题】递归(许多子目录)查找pdf文件并合并为一个pdf文件(linux,bash)【英文标题】:Recursively(many subdirs) find pdf files and merge into one pdf file (linux, bash) 【发布时间】:2020-06-20 19:22:18 【问题描述】:

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

总之,我的 pdf 文件分散在许多子目录中,我想浏览每个子目录并将 pdf 文件合并成一个大 pdf。

这些主要来自:

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

Merge / convert multiple PDF files into one 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

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

【问题讨论】:

find . -type f -name '*.pdf' -exec bash -c 'qpdf --empty --pages "$@" -- merged.pdf' _ +?另见how to ask。 那是完美的...应该有 man bash...所以“$@”是“$1”...什么是“_”? (正如我注意到的,如果它是连接,那么 qpdf 不是多余的吗? 我对qpdf一无所知。 $@$1$n,其中 n 是 find 找到的文件数(假设您有 100-1000 个 pdf),_$0 的占位符。您仍然可以阅读man bashman find,了解更多信息。祝你有美好的一天 【参考方案1】:

一个非常简单的解决方案,使用 iname 代替 name(参见 man find )。

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

之后你必须将 /tmp/out.pdf 复制到你想去的地方。

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

【讨论】:

谢谢!我知道命令替换正在将find 的输出替换为pdf 文件列表,但你为什么使用8?我有 8 个以上的文件...我想我将只使用不带尾管的管道。

以上是关于递归(许多子目录)查找pdf文件并合并为一个pdf文件(linux,bash)的主要内容,如果未能解决你的问题,请参考以下文章

如何按文件类型递归查找文件并将它们复制到目录?

在 pdf 文件中查找特定文本并使用文本打印文件名和行

如何在Java中将两个PDF文件合并为一个?

递归目录树并使用pdf阅读器计算所有pdf文件中的页面

在 Linux 中将多个 jpg 合并为单个 pdf

一个用于合并pdf的简单Python脚本