이라는 하위 디렉터리가 있다고 가정해 보겠습니다 sub
. 그런 다음 해당 디렉터리에 있는 "txt" 확장자를 가진 모든 파일에 대해 작업을 수행하고 싶습니다. 나는 다음과 같은 것을 원한다
for f in sub/*.txt
do
enscript -b "" -o {$f basename excluding .txt}.ps sub/{$f basename excluding .txt}.txt
ps2pdf {$f basename excluding .txt}.ps {$f basename excluding .txt}.pdf
done
sub
따라서 양식의 디렉토리에 파일이 하나만 있는 경우 *.txt
(예: ) sub/foo.txt
, 스크립트는 다음으로 확장되어야 합니다.
enscript -b "" -o foo.ps sub/foo.txt
ps2pdf foo.ps foo.pdf
나는 보통 휴대용 솔루션을 선호하지만, 일을 수행하는 다양한 방법을 배우는 것은 항상 재미있습니다. 따라서 이식 불가능해도 괜찮습니다. 귀하의 솔루션이 이식 가능한지 또는 이식 불가능한지 표시해 주십시오. 또한, 제목이 좋지 않을 수 있으니 자유롭게 수정해주세요.
편집: 작성된 예제가 디렉토리 foo.txt
에 있으므로 에 전달되어야 하므로 이해가 되지 않는다는 것을 깨달았습니다 . 또한 -p 옵션을 좀 더 표준적인 것으로 변경했습니다 .sub
sub/foo.txt
enscript
enscript
-o
답변1
POSIX 셸(예: bash, dash, ksh 등)은 ${var%suffix}
변수 값에서 후행 부분을 제거하는 데 사용할 수 있는 구문을 허용합니다. 예를 들어, if 는 path="sub/file.txt"
로 ${path%.txt}
확장됩니다 sub/file
.
접두사를 제거하는 대칭 구조가 있습니다: ${var#prefix}
. 접두사는 패턴일 수 있습니다. #
가장 긴 일치 접두사를 두 배로 늘립니다 . 예를 들어, if 는 path=sub/dir/file.txt
로 ${path##*/}
확장됩니다 file.txt
(및 ${path#*/}
으로 확장됩니다 dir/file.txt
). 접미사 합계도 마찬가지입니다 %
.
따라서 귀하의 경우 다음과 같이 작성할 수 있습니다. (적어도 POSIX 구성을 사용하는 것뿐만 아니라 접두사 제거와 접미사 제거를 단일 확장으로 결합할 수는 없습니다.)
for f in sub/*.txt; do
base=${f%.txt}
base=${base##*/}
enscript -b "" -o "$base.ps" "$f"
ps2pdf "$base.ps" "$base.pdf"
done
아니면 GNU
기본 이름이 명령은 제거할 파일 확장자인 선택적 두 번째 매개변수를 허용합니다. 예를 들어, 그렇다면 $f
으로 확장합니다 .file.txt
$(basename $f .txt)
file
그러나 이렇게 하면 basename
마지막 구성 요소를 제외한 모든 경로 정보가 제거되므로 확장만 제거하려면 다시 넣어야 합니다(참조
디렉토리 이름주문하다).
답변2
이식 가능한 방법은 확장명 ${f%.*}
과 디렉토리를 사용하고 제거 하는 것입니다 ${f##*/}
(또는basename
.
zsh에서는 신청할 수 있습니다다양한 변신도착하다매개변수 확장, 포함하다기록 수정자r
예를 들어 확장 기능 제거 및 t
디렉터리 부분 제거가 포함됩니다 .
for x in sub/*.txt; do
enscript -b "" -o ${x:t:r}.ps $x
ps2pdf ${x:t:r}.ps ${x:t:r}.pdf
done
기록 수정자를 적용할 수 있습니다.글로벌 모드게다가.
for x in sub/*.txt(:r:t); do
enscript -b "" -o $x.ps sub/$x.txt
ps2pdf $x.ps $x.pdf
done