Shell脚本合并同名文件

Shell脚本合并同名文件

我有一个文件目录,例如:

file.1111111_1.pdf
file.1111111_2.pdf
file.2222222_1.pdf
file.2222222_2.pdf
file.1234567_1.pdf
file.1234567_2.pdf
file.aaaaaaa_1.pdf
file.aaaaaaa_2.pdf
file.abcdefg_1.pdf
file.abcdefg_2.pdf

如何将前 7 位相同文件名合并到同一目录或子目录中的新文件,它应该像这样结束:

file.1111111.pdf
file.2222222.pdf
file.1234567.pdf
file.aaaaaaa.pdf
file.abcdefg.pdf

答案1

合并 pdf 文件的工具有很多,其中之一就是pdfunite.使用此工具执行您需要的操作的简单一行代码如下所示:

for file in file.*_*.pdf; do [[ -e ${file%_*}.pdf ]] && \
    continue || pdfunite ${file%_*}_*.pdf ${file%_*}.pdf; done

我这里用参数扩展机制 ${file%_*}从匹配的文件名中删除后缀模式_*并创建${file%_*}.pdf为输出文件。

答案2

这是使用“convert”命令的快速示例:

$ ls
files.txt  TEST.pdf

TEST.pdf是我从以下网站获得的 Adob​​e PDF这里。这只是我用来填充其余文件名的一个示例。

您的文件名位于files.txt

$ cat files.txt 
file.1111111_1.pdf file.1111111_2.pdf file.2222222_1.pdf file.2222222_2.pdf file.1234567_1.pdf file.1234567_2.pdf file.aaaaaaa_1.pdf file.aaaaaaa_2.pdf file.abcdefg_1.pdf file.abcdefg_2.pdf

使用此文件我生成测试数据:

$ for i in $(<files.txt); do cp TEST.pdf $i; done

$ ls
file.1111111_1.pdf  file.1234567_1.pdf  file.2222222_1.pdf  file.aaaaaaa_1.pdf  file.abcdefg_1.pdf  files.txt
file.1111111_2.pdf  file.1234567_2.pdf  file.2222222_2.pdf  file.aaaaaaa_2.pdf  file.abcdefg_2.pdf  TEST.pdf

现在我们可以循环遍历与您的名称结构匹配的所有文件。然后将它们放入适当的子目录中。然后我们使用“转换”命令将这些 PDF 合并到一个文件中。

$ for pdf in $(ls *.*_*.pdf); do base=$(echo $pdf | cut -d_ -f1) ; \
    [[ -d $base ]] || mkdir $base ; mv $pdf $base/ ; \
    convert $base/*_*.pdf $base/$base.pdf ; done

$ ls
file.1111111  file.1234567  file.2222222  file.aaaaaaa  file.abcdefg  files.txt  TEST.pdf

$ ls file.1111111/ 
file.1111111_1.pdf  file.1111111_2.pdf  file.1111111.pdf

file.11111111.pdf子目录中是您的合并文件。

相关内容