Hot para remover caracteres especiais de nomes de arquivos e renomeá-los em um diretório?

1

Isso é o que eu tenho até agora.

#!/bin/bash

pushd DirectoryName

for file in *.csv; do
    #echo $file
    filename=${file%.*}
    file_clean=${filename//[ ()$+&\.\-\'\,]/_}
    final= "$file_clean.csv"
    mv "$file" $final
done

popd
    
por ThinkCode 19.06.2010 / 00:14

1 resposta

2

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

    
por 19.06.2010 / 02:34