Evite substituir espaços ao renomear arquivos

10

Estou tentando renomear arquivos assim:

for file in *;
do
mv -i "$file" "$(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')";
done

Mas o comando sed substitui todos os espaços por _ .

Como posso editar o comando sed para torná-lo incluir espaços junto com os caracteres especificados? Eu tentei usar \s , mas não funciona ...

EDIT:
Por exemplo: o arquivo trip: hill deve ser renomeado: trip_ hill , mas o comando acima torna trip__hill .

    
por Zanna 22.12.2017 / 14:39

2 respostas

11

Não analise nomes de arquivos com sed ! A saída de echo "$file" pode não ser confiável.

Use rename . Em 17.10 você precisa instalá-lo primeiro

sudo apt install rename

Então:

rename -n -- 's/[^-A-Za-z0-9_ .]/_/g' *

Notas

  • remova -n após o teste para realmente renomear os arquivos
  • -- fim de opções no caso de qualquer arquivo começar com -
  • [^-A-Za-z0-9_ .] caracteres que não queremos substituir - coloque - primeiro ou último para que não possa indicar um intervalo (ele é tratado literalmente nessas posições).
  • Espaços podem ser incluídos na classe
  • . é tratado literalmente (em outros contextos regex, significa qualquer caractere e precisa ser ignorado).

Isso também funciona em sed :

$ echo 'trip: hill' | sed 's/[^-A-Za-z0-9 _.]/_/g'
trip_ hill

Se eu adicionar um espaço ao final da sua versão, recebo um erro:

$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._- ]/_/g'
sed: -e expression #1, char 22: Invalid range end

Mas com - no final, funciona:

$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._ -]/_/g'
trip_ hill

Então, talvez a posição do hífen tenha causado o seu problema quando você adicionou o espaço. Mas o conselho para não analisar nomes de arquivo permanece!

    
por Zanna 22.12.2017 / 15:27
2

Você também pode usar o shell, expansão de parâmetro do Bash pode fazer substituição:

for f in ./* ; do
    mv "$f" "${f//[^-A-Za-z0-9._ ]/_}"
done

A barra dupla diz para substituir todas as correspondências, além disso, a sintaxe é direta.

    
por ilkkachu 25.12.2017 / 20:53