Caso - eu
Como você deseja renomear um arquivo 01 - This is a song.mp3
to This is a song.mp3
trimming 01 -
no início. Isso pode ser feito assim,
$ echo "01 - This is a song.mp3" | sed 's/^[0-9]* - //'
This is a song.mp3
Como funciona:
- Primeiro, identifique a parte comum (dois números no início do nome do arquivo seguido por um espaço, um hífen e outro espaço) que você deseja substituir de todos os nomes de arquivos aqui.
- Em seguida, precisamos de um regexp para a parte comum.
- O caret
^
corresponde à posição anterior ao primeiro caractere em uma string e o conjunto de caracteres[0-9]
corresponde a um único dígito entre 0 e 9. - O asterisco
^[0-9]*
corresponde a um ou mais dígitos entre 0 e 9 no início da string. - Portanto,
^[0-9]* -
é nosso regexp desejado, que corresponde a um ou mais dígitos entre 0 e 9 no início da string, seguido por um espaço, um hífen e outro espaço.
De man sed
s/regexp/replacement/
Attempt to match regexp against the pattern space. If successful,
replace that portion matched with replacement.
Por exemplo, tente no terminal
$ echo "Good day" | sed 's/day/night/'
Good night
$ echo "Good day" | sed 's/day//' ## replacement is kept blank
Good
- Vamos olhar para o nosso problema original. Não queremos que a parte correspondida permaneça na expressão e seja substituída por em branco usando
sed
.
Caso - II
O segundo conjunto de arquivos que você deseja renomear de This is a song - Some Artist.mp3
para This is a song
trimming - Some Artist
no final. Experimente
$ echo "This is a song - Some Artist.mp3" | sed 's/ -.*/.mp3/'
This is a song.mp3
Como funciona:
- Primeiro, identifique as strings a serem substituídas. Aqui é a parte da string que começa em um espaço seguido por um hífen e o restante da string. Mas queremos que a extensão
.mp3
esteja intacta. - Aqui, minha abordagem era combinar a sequência inteira após um espaço seguido por um hífen e substituí-la por
.mp3
, de modo que permanecesse na sequência no final da sequência após a substituição. - O ponto
.
corresponde a um único caractere, sem importar qual é esse caractere. A única exceção são os caracteres de quebra de linha. -
-.*
corresponde a um ou mais caracteres após um espaço e hífen. Observe que ele também corresponderá a.mp3
. - Por isso, usando
sed
, substituí a parte correspondente por.mp3
você pode aprender mais sobre o regexp no regular-expressions.info
Um regexp melhor para o caso II
Esta parte eu tirei de steeldriver
echo "This is a song - Some Artist.mp3" | sed 's/ -[^.]*//'
This is a song.mp3
Como funciona:
- Aqui, a abordagem é corresponder à parte da string depois de um espaço seguido por um hífen antes do ponto
.
de.mp3
e para substituir a parte correspondente por em branco. -
[^.]
corresponde a qualquer caractere, mas não a um ponto.
- Finalmente, o regexp
-[^.]*
corresponde a um espaço seguido por um hífen um ou mais caracteres, mas não um ponto.
ou outra palavra antes de encontrar um ponto.
, que é o nosso regexp desejado.
Renomeação de arquivos
Renomeie os arquivos usando sed
e for
loop no bash shell
Para renomear arquivos conforme descrito no caso I, você pode usar:
for i in *.mp3; do mv "$i" "$(echo $i | sed 's/^[0-9]* - //')" ; done
Para renomear arquivos conforme descrito no caso II, você pode usar:
for i in *.mp3; do mv "$i" "$(echo $i | sed 's/ -.*/.mp3/')" ; done
Uma alternativa melhor para evitar loop + sed usando rename
rename -v 's/^[0-9]* - //' *.mp3 # For the first set
rename -v 's/ -.*/.mp3/' *.mp3 # For the second set