find execに入力ファイル名を正しく送信する方法は?

find execに入力ファイル名を正しく送信する方法は?

単一のLaTeXソースから2つのPDF出力ファイルを作成したいと思います。

1つの出力ファイルは公開され、もう1つ(追加情報を含む)は非公開になります。

私はディレクトリ内のtexファイルを見つけるためにgrepを使うmakeファイルを使います。この方法では、コンテンツを変更することなく多くのプロジェクトで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:もう少し簡単に説明できると思います。

このコマンドはコマンドシェルで実行されます。

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 -cfindが提供するパスを処理し、ファイル名のみを抽出する必要があります。

答え2

すでにMakefileを使用しているので、ファイルが現在のディレクトリにあるというfind単純なケースを想定して、ファイルを処理するためのMake独自のメカニズムにファイルを置き換えることができます。.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は必要な出力ファイル数の2倍を得るためにサフィックスを別のサフィックスに置き換えてこれらの名前.texを変換します。.pdf

次の2行はtexファイルからpdfファイルを生成する方法を説明する規則を設定し、次の2行は異なるサフィックスを生成する方法を説明する別の規則を設定します。$<入力ファイルと出力ファイル名に置き換えられます。$@

最後に、実際の目標all:は目的のPDFファイルに依存していると言います。 makeルールを使用すると、ソースtexファイルが変更されていないとPDFが書き換えられないという利点があります。

関連情報