Eu usaria o seguinte:
#! /bin/bash
cd DirectoryName
for file in *.csv; do
filename=${file%.*}
file_clean='echo $filename | tr -cs "[:alnum:]_" _ '
final="$file_clean.csv"
echo "mv \"$file\" \"$final\" "
done
cd ..
As únicas alterações são:
1) Houve um espaço após o = na linha final= "$file_clean.csv"
. Eu removi isso.
2) Em vez de usar o comando de substituição de string, usei o comando tr
. Com tr, a opção -c
diz para substituir qualquer caracter que não seja no conjunto. Então eu posso especificar os caracteres que eu quero manter (alfanuméricos e o sublinhado, neste caso) e todos os outros serão transformados.
Isso deve corresponder a alguns caracteres mais especiais que são difíceis de especificar por meio da substituição direta, como []\{}
e "
. A opção -s
significa que apenas um sublinhado será gerado mesmo se suprimir vários caracteres. Assim abc((((())))).csv
traduz em abc_.csv
em vez de abc__________.csv