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

おすすめ記事