Isto é obviamente para o propósito de outros googlers como eu, não o OP, visto que tem mais de 5 anos. Mas essa solução existia na época também.
Você pode tentar uma substituição bash para remover o maior padrão do final da string que se parece com $ {varname %% pattern}, mais aqui:
link
Deve ser mais rápido do que gerar outro processo como o tr para lidar com isso.
VARNAME=$'a_bad_filename\r'
VARNAME="${VARNAME%%[[:cntrl:]]}"
Aqui está uma referência para a correspondência de padrões bash severamente limitada ( não é realmente expressão regular, mais de uma expressão 'like' ou 'glob'). Quanto ao motivo pelo qual o retorno de carro está na classe de controle e não na classe de espaço em branco, não tenho certeza. É considerado espaço em branco em outras línguas. Sem ativar a correspondência estendida de padrões por meio de um "extglob shopt -s", não há como especificar uma construção simples como "este caractere repetido 0 ou mais vezes" no bash. Eu também encontrei
printf "%q" "${VARNAME}"
.. além de "set -vx" para mostrar / testar o retorno de carro.
Eu me deparei com esse problema ao usar o cygwin bash contra a saída da versão padrão (não-cygwin) do python; Estou confuso sobre por que não estou vendo mais sobre como resolvê-lo.