脚本将 2 个文件合并为 1 个文件并重复,直到文件夹中的所有 500 个文件合并为 250 个文件

script to combine 2 files into 1 file and repeat until all the 500 files in the folder are combined into 250 files

我有一个包含 500 个 pdf 文件的文件夹。我需要将 2 个文件合并为 1 个文件并创建 250 个 pdf 文件

file1.pdf + file2.pdf >> combined1.pdf

file3.pdf + file4.pdf >> combined2.pdf

file499.pdf + file500.pdf >> combined250.pdf

有人可以帮忙编写一个简单的 sh 脚本吗?

不清楚您所说的“合并”是什么意思。我猜你不能只连接两个 PDF 文件。但是除此之外,还有这样的事情吗?

for this in file{[1-9],[1-9][0-9],[1-9][0-9][0-9]}.pdf; do
    case $this in
     *[13579].pdf)
        prev=$this; continue;;
     *) base=${this%.pdf}
        cat "$prev" "$this" >combined$((${base#file} / 2)).pdf;;
    esac
done

显然,将愚蠢的 cat 替换为可以将两个 PDF 文件正确组合成一个有效的单个 PDF 文件的东西。 Merge / convert multiple PDF files into one PDF 有一些命令,但我会留给您选择安装哪一个。

复杂的通配符file{...}.pdf是因为我们希望文件按照数字顺序列出,所以不能简单地使用file*.pdf.

大括号扩展 file{[1-9],[1-9][0-9],etc}.pdf 是一个 Bash 功能。如果不使用Bash,拼写出来,比如file[1-9].pdf file[1-9][0-9].pdf fileetc.pdf

当我们查看编号为奇数的文件名时,我们只是将其保存以供下一次迭代使用,并跳过循环的其余部分。当我们看到一个偶数编号的文件时,我们将其与我们从上一次奇数迭代中记住的文件结合起来。

(显然,如果你有奇数个文件,最后一个将被跳过。)

parameter expansion ${this%.pdf} returns $this 的值加上 .pdf 后缀 trimmed 关闭。然后我们执行另一个参数扩展 ${base#file} 到 trim 结果中的静态前缀 file,只产生文件名中的数字。然后我们将其除以 2 以生成组合文件的编号。符号 $(( ... )) 生成一个 算术上下文 ,其中计算简单的整数算术表达式。 (否则 shell 根本不会计算数值表达式。)

如果您的真实姓名被命名为 something1.pdf 而不是 file1.pdf 等,请在通配符和替换 ${base#something}.

中替换 file

演示:https://ideone.com/hyERFB