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]}
。または、最後の3文字を削除すると、${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