Escapando o caractere de ponto em tr -dc

1

Estou tentando renomear arquivos usando tr . O seguinte comando quase funciona:

for file in ./*; do mv -v "$file" $(echo "$file" | tr ' []' '-' | tr -dc 'A-Za-z0-9_-' | tr '[:upper:]' '[:lower:]'); done

No entanto, o comando também remove os caracteres de pontos. Então, esse arquivo:

St Nicholas' church from NE [1235] 1936-08-01.jpg

torna-se

st-nicholas-church-from-ne--1235--1936-08-01jpg

Eu tentei várias maneiras de escapar do ponto, por exemplo, usando tr -dc 'A-Za-z0-9\._-' e tr -dc "A-Za-z0-9\._-"

O resultado invariavelmente é que todos os personagens são deletados. Então, minha pergunta, como escapar corretamente do caractere de ponto em tr -dc ?

    
por rkhff 30.12.2016 / 16:51

1 resposta

1

Basta adicionar o ponto no conjunto de "caracteres permitidos". Adicione também o caractere / (parte do caminho).

for f in ./*; do
  new_f="$( printf "%s" "$f" | tr ' []' '-' | tr -dc 'A-Za-z0-9_./-' | tr '[:upper:]' '[:lower:]')"
  printf "Would move '%s' to '%s'\n" "$f" "$new_f"
done

Isso resulta em

Would move './St Nicholas' church from NE [1235] 1936-08-01.jpg' to './st-nicholas-church-from-ne--1235--1936-08-01.jpg'
    
por 30.12.2016 / 16:59

Tags