쉘 글로브 일치에 해당하는 문자열을 반환합니다.

쉘 글로브 일치에 해당하는 문자열을 반환합니다.

이라는 하위 디렉터리가 있다고 가정해 보겠습니다 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 옵션을 좀 더 표준적인 것으로 변경했습니다 .subsub/foo.txtenscriptenscript-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

관련 정보