在bash中将jpegs列表转换为pdf

时间:2017-02-16 13:05:35

标签: bash pipe wildcard imagemagick-convert

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

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

browser = webdriver.Chrome('/home/zona/chromedriver')
url = 'https://www.rottentomatoes.com/'
browser.get(url)
time.sleep(10)

try:
    element = WebdriverWait(browser, 10).until(
    EC.presence_of_element_located((By.XPATH,'//body//input[@name="search"]')))
    element =  browser.find_element_by_xpath('//body//input[@name="search"]')
    element.clear()
    element.send_keys("avatar")
except:
    print("cound not find search box")

time.sleep(5)
browser.quit()

给出:

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

这是jpegs应该在pdf中显示的顺序。

'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'

给出

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

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

我的替代方法

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

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

也不起作用。有没有人知道我是如何让这个工作的?

2 个答案:

答案 0 :(得分:2)

更新了答案

嗯,这个空间以及你的数字不是零填充的事实正在结合起来让你进去!我建议,如果您自己生成图像,那么您可以将它们命名为没有空格,并且填充它们的数字以便它们按顺序出现而无需特殊处理?例如。 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

答案 1 :(得分:1)

您要运行的命令基本上是

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