소문자 및 대문자 확장을 매개변수 확장으로 바꾸는 방법은 무엇입니까?

소문자 및 대문자 확장을 매개변수 확장으로 바꾸는 방법은 무엇입니까?

docLinux에서 txt사용하기 위해 파일을 변환 중 입니다 catdoc. 출력 파일과 동일한 파일 이름을 유지하기 위해 .doc확장자를 매개변수 확장으로 바꿉니다 . 하지만 파일 이름 자체에 대문자를 유지하면서 대소문자를 구분 하지 않게 만드는 방법이 .txt많이 있습니다 . 일부 파일의 파일 이름에 점이 포함되어 있어 사용할 수 없습니다..DOC.doc${filename%.doc}.txt${filename%.*}.txt

내 현재 코드:

find "${COMPANYPATH}" -iname '*.doc' | while read -r file; do
    echo "${file}"
    filename=$(basename "${file}")
    path="${file%/*}/"
    mkdir -p "${OUTPUTPATH}/DOC/${path#$COMPANYPATH/}"
    catdoc "${file}" >> "${OUTPUTPATH}/DOC/${path#$COMPANYPATH}${filename%.doc}.txt"
done

입력하다

/home/user/test/2218-0/test.doc
/home/user/test/2218-0/Test2.DOC

예상 출력

/home/user/output/test/DOC/2218-0/test.txt
/home/user/output/test/DOC/2218-0/Test2.txt

중복된 파일이 없습니다.

답변1

Bash에서는 패턴 일치에서 ${filename%.doc}대소문자를 구분하지 않을 수 있다고 생각합니다.zsh로 할 수 있어요, with ${filename%(#i).doc}( setopt extendedglob활성화해야 함) 또는 ksh93.Bash ${filename%~(i:.doc)}nocasematch도움이 되지 않으며 단지 작동 case하고 [[ .. ]]빌드됩니다.

모든 POSIX 셸에는 항상 대문자와 소문자의 명시적인 목록을 사용하는 해결 방법이 있습니다 ${filename%.[dD][oO][cC]}. 또는 마지막 세 문자를 제거하면 ${filename%.???}올바른 find문자만 제공됩니다.

그런 다음 다시 ${filename%.*}가장 짧은 일치 부분만 제거해야 하므로 문제가 되지 않습니다. ( %%가장 긴 것은 제거됩니다.)

지쉬어:

% setopt extendedglob
% filename=foo.bar.DoC
% echo ${filename%.(#i)doc}.txt
foo.bar.txt

쉿/슬램:

$ filename=foo.bar.DoC
$ echo "${filename%.[dD][oO][cC]}.txt"
foo.bar.txt
$ echo "${filename%.*}.txt"
foo.bar.txt

답변2

넌 몰라. 확장 프로그램을 완전히 제거하세요.

find "${COMPANYPATH}" -iname '*.doc' | while read -r file; do
    echo "${file}"
    filename=$(basename "${file}")
    name="${file%.*}"
    path="${file%/*}"
    noComPath="${path#$COMPANYPATH/}"
    mkdir -p "${OUTPUTPATH}/DOC/$noComPath"
    catdoc "${file}" >> "${OUTPUTPATH}/DOC/$noComPath/$name.txt"
done

이 표현식은 name="${file%.*}"변수를 name파일 이름으로 설정하고 .마지막부터 끝까지 모든 것을 제거합니다. 많은 경우 .마지막 하나만 제거하십시오.

$ foo=file.foo.bar.DoC
$ echo "${foo%.*}"
file.foo.bar

다음은 임의의 파일 이름을 처리할 수 있는 보다 강력한 버전입니다(예: 파일 이름에 개행 문자가 포함되어 있으면 실패합니다).

LC_ALL=C find "${COMPANYPATH}" -iname '*.doc' -type f -print0 |
  while IFS= read -r -d '' file; do
    printf>&2 'Processing "%s"\n' "${file}"
    basename="${file##*/}"
    dirname="${file%/*}"
    rootname="${basename%.*}"
    targetdir=${OUTPUTPATH}/DOC/${dirname#"${COMPANYPATH}/"}
    mkdir -p -- "${targetdir}" &&
      catdoc -- "${file}" >> "${targetdir}/${rootname}.txt"
  done

관련 정보