Estou tentando renomear arquivos como este:
for file in *;
do
mv -i "$file" "$(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')";
done
Mas o sed
comando substitui todos os espaços com _
.
Como posso editar o sed
comando para incluir espaços junto com os caracteres especificados? Eu tentei usar, \s
mas ele não funciona ...
EDIT:
Por exemplo: o arquivo trip: hill
deve ser renomeado:, trip_ hill
mas o comando acima o faz trip__hill
.
command-line
bash
sed
batch-rename
Zanna
fonte
fonte
Respostas:
Não analise nomes de arquivos com
sed
! A saída deecho "$file"
pode não ser confiável.Use
rename
. Na 17.10, você precisa instalá-lo primeiroEntão:
Notas
-n
após o teste para renomear os arquivos--
fim de opções, caso algum arquivo comece com-
[^-A-Za-z0-9_ .]
caracteres que não queremos substituir - coloque o-
primeiro ou o último para que não possa indicar um intervalo (é tratado literalmente nessas posições)..
é tratado literalmente (em outros contextos regex, significa qualquer caractere e precisa ser escapado).Isso também funciona em
sed
:Se eu adicionar um espaço ao final da sua versão, recebo um erro:
Mas com
-
no final, funciona:Talvez a posição do hífen tenha causado seu problema quando você adicionou o espaço. Mas o conselho para não analisar nomes de arquivos permanece!
fonte
.
é literal em uma classe de caracteres. TIL!Você também pode usar o shell, a expansão de parâmetros do Bash pode fazer a substituição:
A barra dupla diz para substituir todas as correspondências, além disso, a sintaxe é direta.
fonte