find exec에 입력 파일 이름을 올바르게 제출하는 방법은 무엇입니까?

find exec에 입력 파일 이름을 올바르게 제출하는 방법은 무엇입니까?

단일 LaTeX 소스에서 두 개의 PDF 출력 파일을 만들고 싶습니다.

하나의 출력 파일은 공개되고 다른 하나(추가 정보 포함)는 비공개가 됩니다.

나는 디렉토리에서 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는 원하는 출력 파일 수의 두 배를 얻을 수 있도록 접미사를 다른 접미사 .tex로 대체하여 이러한 이름을 변환합니다..pdf

다음 두 줄은 tex 파일에서 pdf 파일을 생성하는 방법을 설명하는 규칙을 설정하고, 다음 두 줄은 다른 접미사를 생성하는 방법을 설명하는 또 다른 규칙을 설정합니다. $<입력 파일 및 출력 파일 이름으로 대체 됩니다 .$@

마지막으로, 실제 목표 all:는 원하는 PDF 파일에 달려 있다고 말합니다. make 규칙을 사용하면 소스 tex 파일이 변경되지 않은 경우 PDF가 다시 작성되지 않는다는 장점이 있습니다.

관련 정보