Há, evidentemente, algo estranho acontecendo em torno da correspondência de caracteres curingas sem distinção entre maiúsculas e minúsculas. De acordo com a saída ls
, os nomes dos arquivos contêm (AutoFlac)
, enquanto o seu script procura (AutoFLAC)
. As ferramentas Unix tradicionalmente consideram que dois nomes de arquivos são os mesmos apenas se forem idênticos byte a byte; não há nada embutido para correspondência insensível a maiúsculas e minúsculas. O Bash parece se comportar de maneira inconsistente em um sistema de arquivos insensível a maiúsculas e minúsculas, isso pode ser um bug.
Seu script seria mais robusto se você usasse aspas duplas em torno das substituições de variáveis. Se você não fizer isso, o bash (como outros shells) executa o globbing no resultado da substituição da variável. Esta pode ser a fonte do seu problema. Sempre coloque aspas duplas em torno de substituições de variáveis e substituições de comandos: "$foo"
, "$(foo)"
a menos que você saiba que deseja executar a divisão de palavras e globbing no resultado. Além disso, seu script com aspas duplas ausentes não funcionaria em alguns nomes de arquivos, por exemplo, com sequências de espaço em branco que não são um único espaço.
Eu também recomendo fazer a substituição de texto dentro do shell, há menos risco de manchar nomes de arquivos dessa maneira.
SUFFIX="(AutoFlac)"
for entry in *"$SUFFIX"*; do
target=${entry/ $SUFFIX/}
mv -- "$entry" "$target"
done
Não há como forçar a correspondência de caracteres curingas que não diferenciam maiúsculas de minúsculas, mas você pode fazer com que seu script ignore maiúsculas e minúsculas, fazendo sua correspondência.
SUFFIX="(autoflac)"
for entry in *; do
if [[ ${entry,,} = *$SUFFIX* ]]; then
# Remove everything from the last space to the last .
mv -- "$entry" "${entry% *}.${entry##*.}"
fi
done