将从命令获取的每个文件作为参数传递给另一个命令

时间:2017-09-22 08:13:29

标签: linux bash

我使用以下行来获取pdf并将其拆分:

pdfseparate -f 14 -l 23 ALF.SS.0.pdf "${FILE}"-%d.pdf

现在我想要生成每个文件,运行这样的几个命令:

pdfcrop --margins '-30 0 -385 0' outputOfpdfSeparate outputOfpdfSeparate-1stCol.pdf

我正在试图找出最佳方法:

  1. 对于pdfseparate创建的每个文件,使用单个循环,如果我设法“知道”文件的名称,我可以将其传递给pdfcrop并完成。但由于它使用%d,我不知道如何处理这个“新名称”,其中每个文件都有一个新的数字。我知道如何用Java做到这一点但在这里我看不太清楚。

  2. 使用管道。如果我这样做,我想我有同样的问题

    pdfseparate [options] | pdfcrops inputfile outputfile

    我不知道如何“使用”inputfile的名称。我确信这很容易,但我没有看到它。

  3. 使用xargs。我正在研究这个命令,因为它对我来说是新的。

  4. 使用exec。我觉得这不是必要的,但也许我错了,因为自从我上次使用exec以来已经有很长一段时间了。

  5. 提前致谢。

2 个答案:

答案 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

现在为你的情况;如果您想使用这些(= xargsparallel)或您自己的命令,您应该注意到第一个命令应该将其输出发送到stdout。因为第二个命令将从第一个命令stdin读取stdout,而会为您执行此操作。

因此,您可以将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;