小文字と大文字の拡張をパラメータ拡張に置き換える方法は?

小文字と大文字の拡張をパラメータ拡張に置き換える方法は?

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]}。または、最後の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

関連情報