我使用以下行来获取pdf并将其拆分:
pdfseparate -f 14 -l 23 ALF.SS.0.pdf "${FILE}"-%d.pdf
现在我想要生成每个文件,运行这样的几个命令:
pdfcrop --margins '-30 0 -385 0' outputOfpdfSeparate outputOfpdfSeparate-1stCol.pdf
我正在试图找出最佳方法:
对于pdfseparate创建的每个文件,使用单个循环,如果我设法“知道”文件的名称,我可以将其传递给pdfcrop并完成。但由于它使用%d,我不知道如何处理这个“新名称”,其中每个文件都有一个新的数字。我知道如何用Java做到这一点但在这里我看不太清楚。
使用管道。如果我这样做,我想我有同样的问题
pdfseparate [options] | pdfcrops inputfile outputfile
,
我不知道如何“使用”inputfile的名称。我确信这很容易,但我没有看到它。
使用xargs。我正在研究这个命令,因为它对我来说是新的。
使用exec。我觉得这不是必要的,但也许我错了,因为自从我上次使用exec以来已经有很长一段时间了。
提前致谢。
答案 0 :(得分:1)
您可以使用xargs
。这是速度方面的最佳方式。
我通常用它将很多.mp4
文件转换为.mp3
。
逐个进行此转换不仅乏味而且需要很长时间。因此,您可以借助-P 0
xargs
选项使用自动并行机制
例如,如果我有10个.mp4
个文件,我会这样做:
ls *.mp4 | xargs -I xxx -P 0 ffmpeg -i xxx xxx.mp3
跑完这条线后; 10 ffmpet
个命令同时运行。
另一种方法是将.mp4
文件列表存储在文本文件中,如下所示:
ls *.mp4 > list-mp4
然后:
xargs -I xxx -P 0 ffmpeg -i xxx xxx.mp3 < list-mp4
或者您可以访问GNU并行。因此你可以:
parallel ffmpeg -i {} {}.mp3 ::: *.mp4
现在为你的情况;如果您想使用这些(= xargs
或parallel
)或您自己的命令,您应该注意到第一个命令应该将其输出发送到stdout
。因为第二个命令将从第一个命令的stdin
读取stdout
,而bash会为您执行此操作。
因此,您可以将pipe
== |
与pdfseparate
一起使用,而不是将其输出发送到stdout
。如果它确实/不能,那么pipe
== 第二个命令的右侧不执行任何操作,反之亦然:第二个命令应该/可以从传入的stdin
中读取stdout
。
例如
ls *.txt | echo {}
此处echo
未从stdout
命令中读取任何传入的ls
,只打印{}
最终,您的pdfseparate
应发送至stdout
。然后xargs
将其存储在-I anything-your-like
中,然后调用第二个命令
为此:
pdfseparate options... | xargs -I ABC -P 0 your-second-command+its-options ABC
注意1 xargs
逐行在stdout
中存储给定的ABC
,并将其传递给第二个命令< / strong>作为输入
NOTE-2 您根本不必使用-P 0
。它只是为了加快执行时间。您可以省略它,但第二个命令每个传入线都是同步的。
答案 1 :(得分:0)
pdfseparate不输出它创建的文件,因此你必须使用&#34; ls&#34;命令获取文件列表,你想要操作。 #分离pdfs pdfseparate -f 14 -l 23 ALF.SS.0.pdf&#34; $ {FILE}&#34; - %d.pdf
# operate on the just created files, assumes that a "FILE" variable is set, which might not be the case
for i in $(ls "${FILE}-*.pdf"); do pdfcrop --margins '-30 0 -385 0' $i; done;
# assuming that FILE variable in your case would match ALF.SS.0-[0-9]*.pdf, you'd use this:
for i in $(ls ALF.SS.0-[0-9]*.pdf); do pdfcrop --margins '-30 0 -385 0' $i; done;