如何正确地将输入文件名提交到 find exec 中?

如何正确地将输入文件名提交到 find exec 中?

我想创建单个 LaTeX 源的两个 pdf 输出文件。

一个输出文件是公开的,而另一个(包含更多信息)则变为私有。

我使用 make 文件,它使用 find 来 grep 目录中的 tex 文件。这是一个简单的解决方案,因为这样我可以在许多项目中重用 makefile,而无需修改其内容。

这是makefile 的重要部分。

all:    
        # This creates the public output file
        find -name *.tex -exec sh -c 'pdflatex {}' \;

现在我想添加另一行来创建私有输出文件。它应该看起来像这样:

all:    
        # This creates the public output file
        find -name *.tex -exec sh -c 'pdflatex {}' \;
        # This creates the private output file
        find -name *.tex -exec sh -c 'pdflatex --jobname=ABC  '\def\privatflag{}\input{XYZ}' {}' \;

对于 ABC,我寻找一种解决方案来指定默认文件名但带有前缀。

对于 XYZ,我寻找一种解决方案来在此处传递输入文件名。

我认为内部引号的使用在这里也不正确。

更新1: 也许我可以用更简单的方式解释这个问题。

该命令在命令 shell 中运行:

pdflatex --jobname=outputfile '\def\privatflag{}\input{inputfile.tex}'

但我正在寻找一种使用它的解决方案,find -name *.tex -exec这样我就不需要指定输入文件名 inputfile.tex。

另外,我还在寻找一种不需要指定的方法--jobname=outputfile。它应该使用附加前缀匹配输入文件名。

更新2: 谢谢穆鲁斯蒂芬·查泽拉斯,问题已解决。

这是现在 makefile 的重要部分

all:    
        # This creates the public output file
        find -name *.tex -exec sh -c 'pdflatex {}' \;
        # This creates the private output file
        find . -name '*.tex' -execdir sh -c 'pdflatex --jobname=privat_"$${1##*/}" "\def\privatflag{""}\input{$${1##*/}}"' {}-job {} \;

答案1

从你的例子来看,我认为你需要的是:

find . -name '*.tex' -execdir sh -c 'pdflatex --jobname=foo"${1##*/}" "\def\privatflag{""}\input{${1##*/}}"' {}-job {} \;

分解它:

  • -execdir在找到该文件的目录中运行该命令。
  • ${1##*/}从 给出的参数中去除路径find
  • in""{}为了防止find替换{}成匹配的路径。

sh -c需要处理 find 给出的路径并仅提取文件名。

答案2

由于您已经在使用 Makefile,因此您可以用 make 自己的机制来替换您的文件来处理文件,假设您的文件位于当前目录中的find简单情况。.tex例如,这个 makefile 可能就足够了:

ALLTEX = $(wildcard *.tex)
ALLPDF = $(ALLTEX:.tex=.pdf) $(ALLTEX:.tex=.internal.pdf)

%.pdf: %.tex
        pdflatex $<
%.internal.pdf: %.tex
        pdflatex --jobname=$@ '\def\privatflag{}\input{$<}'

all: $(ALLPDF)

变量 ALLTEX 保存所有输入文件的名称,ALLPDF 通过将后缀替换.tex.pdf另一个后缀来转换这些名称,这样您就可以获得两倍数量的所需输出文件。

接下来的 2 行设置了一个规则,说明如何从 tex 文件生成 pdf 文件,接下来的 2 行设置了另一个规则,说明如何生成其他后缀。将被输入文件和输出文件名$<替换。$@

最后,真正的目标all:说这取决于想要的pdf文件。使用 make 规则的优点是,如果源 tex 文件没有更改,则不会重建 pdf。

相关内容