Estou convertendo doc
arquivos para txt
usar catdoc
no Linux. Para manter o mesmo nome de arquivo do arquivo de saída, estou substituindo a .doc
extensão pelo .txt
uso do parâmetro expension. Mas existem muitos arquivos doc que terminam em .DOC
. Como tornar o .doc
caso ${filename%.doc}.txt
insensível mantendo as letras maiúsculas no próprio nome do arquivo? Não consigo usar ${filename%.*}.txt
porque alguns arquivos possuem pontos no nome do arquivo
Meu código atual:
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
entrada
/home/user/test/2218-0/test.doc
/home/user/test/2218-0/Test2.DOC
Resultado esperado
/home/user/output/test/DOC/2218-0/test.txt
/home/user/output/test/DOC/2218-0/Test2.txt
Não há arquivos duplicados.
Eu não acho que você possa fazer com que o padrão corresponda
${filename%.doc}
sem distinção entre maiúsculas e minúsculas no Bash. Você poderia fazer isso zsh , com${filename%(#i).doc}
(requersetopt extendedglob
habilitado). O Bashnocasematch
não ajuda, ele apenas funcionacase
e[[ .. ]]
constrói.Em qualquer shell, sempre há a solução alternativa de listar explicitamente caracteres maiúsculos e minúsculos com
${filename%.[dD][oO][cC]}
.Então, novamente,
${filename%.*}
você deve remover apenas a parte correspondente mais curta, então isso também não deve ser um problema. (%%
removeria o mais longo.)zsh:
sh/Bash:
Você não. Basta remover totalmente a extensão:
A expressão
name="${file%.*}"
definirá a variávelname
como o nome do arquivo com tudo do último.
ao final removido. Se houver muitos.
, apenas o último será removido:E aqui está uma versão mais robusta que pode lidar com nomes de arquivos arbitrários (você falharia se um nome de arquivo contivesse um caractere de nova linha, por exemplo):