doc
Linux에서 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