在 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.jpg
、file-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
我想将一堆 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.jpg
、file-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