![find exec에 입력 파일 이름을 올바르게 제출하는 방법은 무엇입니까?](https://linux55.com/image/79856/find%20exec%EC%97%90%20%EC%9E%85%EB%A0%A5%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EC%98%AC%EB%B0%94%EB%A5%B4%EA%B2%8C%20%EC%A0%9C%EC%B6%9C%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
단일 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 -c
find에서 제공하는 경로를 처리하고 파일 이름만 추출해야 합니다.
답변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가 다시 작성되지 않는다는 장점이 있습니다.