Bash 访问所有子目录并从每个pdf中提取第一页

Bash 访问所有子目录并从每个pdf中提取第一页,bash,pdftk,Bash,Pdftk,我有一些电子书籍文件夹,我想从每本书中提取第一页。有超过两百本书,所以手动操作这是一个巨大的背部疼痛,将是非常耗时的 我有一个命令,可以为单个文件执行此任务 pdftk TehInput.pdf cat 1 output cover_TehInput.pdf 如何将其包装成一个脚本,访问所有内容并为输出指定名称,如cover\u wtv-original-name-is.pdf?所有输出文件可能到处都是,就像脚本启动的目录中一样,或者在原始文件附近。您想使用find命令执行此操作。比如: fi

我有一些电子书籍文件夹,我想从每本书中提取第一页。有超过两百本书,所以手动操作这是一个巨大的背部疼痛,将是非常耗时的

我有一个命令,可以为单个文件执行此任务

pdftk TehInput.pdf cat 1 output cover_TehInput.pdf

如何将其包装成一个脚本,访问所有内容并为输出指定名称,如
cover\u wtv-original-name-is.pdf
?所有输出文件可能到处都是,就像脚本启动的目录中一样,或者在原始文件附近。

您想使用
find
命令执行此操作。比如:

find . -iname '*.pdf' -exec pdftk '{}' cat 1 output '{}'.cover.pdf ';'
这将从当前目录(
)向下查找所有PDF,然后执行

pdftk filename.pdf cat 1 output filename.pdf.cover.pdf

在上面。这是传递给pdftk的整个路径,因此您最终会得到与原始文件位于同一目录中的封面PDF。(如果需要的话,您可以做一些事情来去掉
.pdf.cover.pdf
扩展名。)

如果在文件名中不使用空格或换行符:

find . -iname '*.pdf' -printf "%h %f\n" | sed -E 's|(.*) (.*)|echo pdftk \1/\2 cat 1 output \1/cover_\2|' | sh

如果输出正常,请删除“echo”。

有什么原因不能在
ls
上循环吗?@ssdecontrol:。@gniourf\u gniourf在您无法控制的上下文中编写健壮的代码来处理其他人的文件时,这是正确的,是的。但我们都知道,解析
ls
输出通常是对一堆文件执行一次性任务的最简单方法,这些文件的来源您知道,并且您确定名称中没有任何换行符。@ssdecontrol
for i in*.pdf
实际上比
for i in$(ls*.pdf)
的键入时间短。我看不出
ls
的解析比globs更容易@gniourf_gniourf通常是这样,但是没有一种快速的方法可以使用globs来执行
ls-tr|…
。@Cyrus您不能将
cover
放在
'{}'
前面,因为
'{}'
匹配整个路径,而不仅仅是基名。最后,您将看到路径前面的
cover\
。这就是为什么我添加了一些内容。