在 bash 中将 jpeg 列表转换为 pdf

Convert list of jpegs to pdf in bash

我想将一堆 jpeg 文件转换为一个 pdf 文件。这些文件采用编号格式:

gls -v 2014-2015-2016_R_TR-4_all_170213*.jpeg

给出:

'2014-2015-2016_R_TR-4_all_170213 1.jpeg'  
'2014-2015-2016_R_TR-4_all_170213 2.jpeg'
'2014-2015-2016_R_TR-4_all_170213 3.jpeg'
'2014-2015-2016_R_TR-4_all_170213 4.jpeg'
'2014-2015-2016_R_TR-4_all_170213 5.jpeg'
'2014-2015-2016_R_TR-4_all_170213 6.jpeg'
'2014-2015-2016_R_TR-4_all_170213 7.jpeg'
'2014-2015-2016_R_TR-4_all_170213 8.jpeg' 
'2014-2015-2016_R_TR-4_all_170213 9.jpeg'
'2014-2015-2016_R_TR-4_all_170213 10.jpeg'

这是 jpeg 在 pdf 中的显示顺序。

ls -l

给予

-rw-r--r--  1 rziege  staff   662186 13 Feb 16:06 2014-2015-2016_R_TR-4_all_170213 1.jpeg
-rw-r--r--  1 rziege  staff   867422 13 Feb 16:06 2014-2015-2016_R_TR-4_all_170213 10.jpeg
-rw-r--r--  1 rziege  staff   642198 13 Feb 16:06 2014-2015-2016_R_TR-4_all_170213 2.jpeg
-rw-r--r--  1 rziege  staff  1110602 13 Feb 16:06 2014-2015-2016_R_TR-4_all_170213 3.jpeg
-rw-r--r--  1 rziege  staff  1068419 13 Feb 16:06 2014-2015-2016_R_TR-4_all_170213 4.jpeg
-rw-r--r--  1 rziege  staff  1326947 13 Feb 16:06 2014-2015-2016_R_TR-4_all_170213 5.jpeg
-rw-r--r--  1 rziege  staff  1248453 13 Feb 16:06 2014-2015-2016_R_TR-4_all_170213 6.jpeg
-rw-r--r--  1 rziege  staff  1106629 13 Feb 16:06 2014-2015-2016_R_TR-4_all_170213 7.jpeg
-rw-r--r--  1 rziege  staff  1152435 13 Feb 16:06 2014-2015-2016_R_TR-4_all_170213 8.jpeg
-rw-r--r--  1 rziege  staff  1300553 13 Feb 16:06 2014-2015-2016_R_TR-4_all_170213 9.jpeg
-rw-r--r--  1 rziege  staff   867422 13 Feb 16:06 2014-2015-2016_R_TR-4_dir_170213 10.jpeg
-rw-r--r--  1 rziege  staff   642718 13 Feb 16:06 2014-2015-2016_R_TR-4_dir_170213 2.jpeg
-rw-r--r--  1 rziege  staff  1118243 13 Feb 16:06 2014-2015-2016_R_TR-4_dir_170213 3.jpeg
-rw-r--r--  1 rziege  staff  1074675 13 Feb 16:06 2014-2015-2016_R_TR-4_dir_170213 4.jpeg

...

我试过

convert "$file"*.jpeg "$file".pdf

$file=2014-2015-2016_R_TR-4_all_170213

以错误的顺序生成 pdf 文件(1、10、2、3、...)。

我的替代方法

gls -v "$file"*.jpeg | convert "$file".pdf

convert $(gls -v "$file"*.jpeg) "$file".pdf

也不行。有人知道我是如何让它工作的吗?

更新答案

嗯,空格和你的号码不是 zero-padded 的事实结合起来让你进去!如果您自己生成图像,我是否可以建议您在命名它们时不要使用空格,并填充它们的编号,以便它们按顺序出现而不需要特殊处理?例如。 file-0001.jpgfile-002.jpg 等 - 通常只是在生成文件名时使用 sprintf("%03d"...) 的情况。

无论如何,对于手头的案例,我认为我们需要一些笨拙的语法来做到这一点:

gls "$file*.jpg" | while read f; do
   convert "$f" miff:-
done | convert miff:- Something.pdf

原答案

尝试:

gls -v | convert @- something.pdf

你想要运行的命令基本上是

convert '2014-2015-2016_R_TR-4_all_170213 1.jpeg' '2014-2015-2016_R_TR-4_all_170213 2.jpeg' '2014-2015-2016_R_TR-4_all_170213 3.jpeg' '2014-2015-2016_R_TR-4_all_170213 4.jpeg' '2014-2015-2016_R_TR-4_all_170213 5.jpeg' '2014-2015-2016_R_TR-4_all_170213 6.jpeg' '2014-2015-2016_R_TR-4_all_170213 7.jpeg' '2014-2015-2016_R_TR-4_all_170213 8.jpeg' '2014-2015-2016_R_TR-4_all_170213 9.jpeg' '2014-2015-2016_R_TR-4_all_170213 10.jpeg' '2014-2015-2016_R_TR-4_all_170213.pdf'

而不是

convert '2014-2015-2016_R_TR-4_all_170213 1.jpeg' '2014-2015-2016_R_TR-4_all_170213 10.jpeg' '2014-2015-2016_R_TR-4_all_170213 2.jpeg' '2014-2015-2016_R_TR-4_all_170213 3.jpeg' '2014-2015-2016_R_TR-4_all_170213 4.jpeg' '2014-2015-2016_R_TR-4_all_170213 5.jpeg' '2014-2015-2016_R_TR-4_all_170213 6.jpeg' '2014-2015-2016_R_TR-4_all_170213 7.jpeg' '2014-2015-2016_R_TR-4_all_170213 8.jpeg' '2014-2015-2016_R_TR-4_all_170213 9.jpeg' '2014-2015-2016_R_TR-4_all_170213.pdf'

我不熟悉,但我假设 gls -v 正在生成带引号的输出

所以:

gls -v "$file"*.jpeg|tr '\n' ' ';

应该输出:

'2014-2015-2016_R_TR-4_all_170213 1.jpeg' '2014-2015-2016_R_TR-4_all_170213 2.jpeg' '2014-2015-2016_R_TR-4_all_170213 3.jpeg' '2014-2015-2016_R_TR-4_all_170213 4.jpeg' '2014-2015-2016_R_TR-4_all_170213 5.jpeg' '2014-2015-2016_R_TR-4_all_170213 6.jpeg' '2014-2015-2016_R_TR-4_all_170213 7.jpeg' '2014-2015-2016_R_TR-4_all_170213 8.jpeg' '2014-2015-2016_R_TR-4_all_170213 9.jpeg' '2014-2015-2016_R_TR-4_all_170213 10.jpeg'

如果是这样,这应该可以正常工作:

eval 'convert '"$(gls -v "$file"*.jpeg|tr '\n' ' ')"' outfile.pdf'

但为了确保万无一失,请先尝试此操作并检查输出是否为有效的 shell 命令:

echo 'convert '"$(gls -v "$file"*.jpeg|tr '\n' ' ')"' outfile.pdf'

如果 $file 中没有特殊字符的空格,这也是有效的:

echo 'convert '"$(gls -v $file*.jpeg|tr '\n' ' ')"' '$file.pdf