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
答え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
ファイル名に設定し、.
最後から最後まですべてを削除します。多くの場合、.
最後の1つだけを削除してください。
$ 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